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



对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 加密强伪随机字节 进入布夫。如果 PRNG 未设定足够的种子,则会发生错误 随机性,以确保不可预测的字节序列。

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

只是好奇。是速度问题吗?不够靠谱?还是 PRNG 是问题所在(即:当伪在大多数情况下工作正常时难以实现)?

谢谢

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

我注意到,虽然 openssl_random_pseudo_bytes() 函数确实有一个可选的 crypto_strong 参数,在 OpenSSL 看来,它让调用方知道返回的字节是否真的具有加密强度。

顺便说一句,可以使用外部引擎配置OpenSSL,其中一些引擎(例如CHIL)使用基于硬件的随机源进行RAND_pseudo_bytes()RAND_bytes(),如果这是您需要的。

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

最新更新