2

部署我正在处理的 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,以防万一。

谢谢

4

1 回答 1

1

部署我正在处理的 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();
于 2018-10-01T20:14:43.187 回答