PHP是否使用符合FIPS-140的RNG生成会话ID?

PHP是否使用符合FIPS-140的RNG生成会话ID?,php,security,session,cryptography,fips,Php,Security,Session,Cryptography,Fips,部署我正在处理的PHP应用程序的一个要求是使用FIPS-140验证的加密模块 客户特别指出“PHP利用加密弱随机数生成器生成会话ID信息”,并引用了以下报告: 我已经建议他们如何设置session.entropy_length和session.hash_函数来增加熵,但他们没有接受这一点,特别要求我们使用符合FIPS-140的RNG 我不确定散列函数和RNG之间的区别,所以我很难做出回应。有人能推荐一种使用FIPS-140兼容函数在php中生成会话ID的方法吗 我们在Windows+SQL Se

部署我正在处理的PHP应用程序的一个要求是使用FIPS-140验证的加密模块

客户特别指出“PHP利用加密弱随机数生成器生成会话ID信息”,并引用了以下报告:

我已经建议他们如何设置session.entropy_length和session.hash_函数来增加熵,但他们没有接受这一点,特别要求我们使用符合FIPS-140的RNG

我不确定散列函数和RNG之间的区别,所以我很难做出回应。有人能推荐一种使用FIPS-140兼容函数在php中生成会话ID的方法吗

我们在Windows+SQL Server上运行PHP5.4.16,以防万一

谢谢

部署我正在处理的PHP应用程序的一个要求是使用FIPS-140验证的加密模块

我的哀悼。头痛之于FIPS-140,犹如朝露之于海洋

我不确定散列函数和RNG之间的区别,所以我很难做出回应。有人能推荐一种使用FIPS-140兼容函数在php中生成会话ID的方法吗

如果您使用的是ext/mcrypt,
mcrypt\u create\u iv()
使用Windows的CryptGenRandom API,该API应符合FIPS-140。(或者,至少可以这样设置。)该函数是mcrypt唯一的优点,并且与libmcrypt分开存在

如果您使用的是OpenSSL,并且在FIPS模式下编译了OpenSSL,那么同样可以使用
OpenSSL\u random\u pseudo\u bytes()
,并且它应该使用符合FIPS的生成器

最后,如果您升级到PHP7+并使用
random_bytes()
,只要Windows符合FIPS-140,您就是黄金

散列函数在这里并不重要。你想使用一个安全的来源,就是这样。散列并不能给你买任何东西。如果您被迫使用散列函数,请使用批准用于FIPS-140兼容软件的SHA2系列散列函数之一(SHA256、SH384或SHA512)

应通过FIPS-140审核的会话生成器
根据设置,较新的PHP将默认在UNIX ish系统上使用
/dev/*random
。你必须检查你的操作系统文档,看看操作系统在后台做了什么来提供熵。因此,当客户提到PHP的“加密弱随机数生成器”时,他们只是在谈论默认的一个吗?更改熵_文件会隐式地更改随机数生成器吗?当然会。如果将php设置为/dev/uradom,并将其更改为使用/dev/somethingelse,则会得到不同的RNG。RNG在后台做什么完全取决于实现。我不知道Linux的/dev/uradom是否符合fips,或者是否已经提交测试。这是一些你必须深入研究内核源代码的东西。太好了,谢谢。我询问它只是因为这是我最初给客户的答案,他们似乎怀疑设置熵源是否与定义不同的RNG相同。再次感谢。:)请记住,Windows不提供
/dev/*random
设备。如果是“开箱即用”安装,没有额外的硬件或库,那么他们必须使用或其他经批准的生成器(我不确定他们在加密什么)。
<?php
/**
 * @return string
 */
function session_id_fips140()
{
    if (is_callable('random_bytes')) {
        return session_id(bin2hex(random_bytes(32)));
    }
    if (is_callable('mcrypt_create_iv')) {
        return session_id(bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)));
    }
    if (is_callable('openssl_random_pseudo_bytes')) {
        return session_id(bin2hex(openssl_random_pseudo_bytes(32)));
    }

    // Fail closed. Maybe install random_compat?
    throw new Exception("No suitable PRNG is available on the current system!");
}
<?php
ini_set('session.
if (!isset($_COOKIE['PHPSESSID'])) {
    session_id_fips140();
}
session_start();