PHP:openssl_random_pseudo_bytes()和加密安全性与极端随机性

时间:2015-01-23 15:26:03

标签: php cryptography openssl

在PHP中对openssl_random_pseudo_bytes()进行一些研究,我注意到在PHP的源代码中实现了openssl_random_pseudo_bytes()函数。 OpenSSL的 RAND_pseudo_bytes 函数用于生成返回值,而不是OpenSSL中也可用的 RAND_bytes

OpenSSL对这两个功能的文档如下:

  

RAND_pseudo_bytes()将num个伪随机字节放入buf。   由RAND_pseudo_bytes()生成的伪随机字节序列将是   如果它们具有足够的长度,则是唯一的,但不是必需的   不可预知的。它们可用于非加密目的和   密码协议中的某些用途,但通常不用于密钥   一代等。

     

RAND_bytes()将num加密强伪随机字节   进入buf。如果PRNG没有足够播种,则会发生错误   随机性,以确保不可预测的字节序列。

我想我的问题是为什么没有使用RAND_bytes,或者为什么在PHP中还有一个openssl_rand_bytes()函数,根据OpenSSL,它更随机。

好奇。这是速度问题吗?不够可靠吗?或者PRNG是问题(即:当伪作用于大多数目的时很难实现)?

由于

1 个答案:

答案 0 :(得分:3)

选择可能是基于实用性而不是加密的合理性。如果使用RAND_bytes(),则由于可用的随机性不足,该功能可能会失败。毫无疑问,PHP代码的作者希望避免PHP函数失败。

我注意到openssl_random_pseudo_bytes()函数确实有一个可选的crypto_strong参数,它允许调用者知道返回的字节是否确实是加密强大的,在OpenSSL看来。

除此之外,可以使用外部引擎配置OpenSSL,其中一些(如CHIL)使用基于硬件的随机源RAND_pseudo_bytes()RAND_bytes(),如果这样做的话。你需要什么。

此外,在Windows上,PHP代码使用CryptGenRandom