在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是问题(即:当伪作用于大多数目的时很难实现)?
由于
答案 0 :(得分:3)
选择可能是基于实用性而不是加密的合理性。如果使用RAND_bytes()
,则由于可用的随机性不足,该功能可能会失败。毫无疑问,PHP代码的作者希望避免PHP函数失败。
我注意到openssl_random_pseudo_bytes()
函数确实有一个可选的crypto_strong
参数,它允许调用者知道返回的字节是否确实是加密强大的,在OpenSSL看来。
除此之外,可以使用外部引擎配置OpenSSL,其中一些(如CHIL)使用基于硬件的随机源RAND_pseudo_bytes()
和RAND_bytes()
,如果这样做的话。你需要什么。
此外,在Windows上,PHP代码使用CryptGenRandom
。