部署我正在处理的 PHP 应用程序的一个要求是使用经过 FIPS-140 验证的加密模块。
节哀顺变。对 FIPS-140 而言,头痛就像一滴晨露对海洋而言一样。
我不确定哈希函数和 RNG 之间的区别,所以我很难做出回应。谁能建议一种使用符合 FIPS-140 的函数在 php 中生成会话 ID 的方法?
如果您使用的是 ext/mcrypt,请mcrypt_create_iv()
使用应符合 FIPS-140 的 Windows 的 CryptGenRandom API。(或者,至少应该可以这样设置。)该功能是 mcrypt 唯一的好处,并且与 libmcrypt 分开存在。
如果您使用的是 OpenSSL,并在 FIPS 模式下编译 OpenSSL,您可以类似地使用openssl_random_pseudo_bytes()
并且它应该使用符合 FIPS 的生成器。
最后,如果您升级到 PHP 7+ 并使用random_bytes()
,只要 Windows 符合 FIPS-140 标准,那么您就是黄金。
哈希函数在这里真的无关紧要。你想使用一个安全的来源,就是这样。散列它不会给你带来任何东西。如果您被迫使用散列函数,请使用经批准可在符合 FIPS-140 的软件中使用的 SHA2 系列散列函数(SHA256、SHA384 或 SHA512)之一。
应通过 FIPS-140 审核的会话生成器
<?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();