我正在处理的部署PHP应用程序的要求是使用经FIPS-140验证的加密模块。
客户明确指出“PHP使用加密弱随机数生成器生成会话ID信息”并引用此报告:http://berlin.ccc.de/~andreas/php-entropy-advisory.txt
我已经建议他们如何设置session.entropy_length和session.hash_function以增加熵,但他们没有接受这一点,特别要求我们使用符合FIPS-140标准的RNG。
我不确定哈希函数和RNG之间的区别,所以我很难回应。任何人都可以建议一种使用FIPS-140兼容函数在php中生成会话ID的方法吗?
我们在Windows + SQL Server上运行PHP 5.4.16,以防万一。
由于
答案 0 :(得分:0)
我正在处理的PHP应用程序的部署要求是使用经过FIPS-140验证的加密模块。
我的哀悼。令人头疼的是FIPS-140,就像一滴清晨的露珠对海洋一样。
我不确定哈希函数和RNG之间的区别,因此很难做出响应。谁能建议一种使用FIPS-140兼容功能在php内生成会话ID的方法吗?
如果您使用的是ext / mcrypt,则mcrypt_create_iv()
使用Windows的CryptGenRandom API,该API 应该符合FIPS-140。 (或者,至少应该以这种方式进行设置。)该函数是mcrypt的唯一优点,它与libmcrypt分开存在。
如果您使用的是OpenSSL,并且以FIPS模式编译了OpenSSL,则可以类似地使用openssl_random_pseudo_bytes()
,并且它应该使用FIPS兼容的生成器。
最后,如果您升级到PHP 7+并使用random_bytes()
,只要Windows符合FIPS-140,就可以了。
哈希函数在这里确实无关紧要。您想要使用安全的来源,仅此而已。散列不会买任何东西。如果您被迫使用哈希函数,请使用经认可可用于FIPS-140兼容软件的SHA2系列哈希函数之一(SHA256,SHA384或SHA512)。
<?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();