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

时间:2013-09-26 14:50:54

标签: php security session cryptography fips

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

由于

1 个答案:

答案 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)。

应通过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();