但我真正想知道的是,它使加密安全的原因. rand
,mt_rand
和openssl_random_pseudo_bytes
之间的内部差异是什么?
提前致谢.
> rand使用libc随机数生成器(source),它取决于系统,通常不具有加密安全性
> mt_rand使用已知算法,Mersenne Twister,因此得名;这是一种快速算法,可以生成分布良好但不具有加密安全性的randoms
> openssl_random_pseudo_bytes直接调用OpenSSL system for cryptographically-secure randoms(但请参阅完整说明中的警告)
这些属性也列在下表中:
兰特
对于rand,它在mt_rand中声明:
Many random number generators of older libcs have dubIoUs or unknown characteristics and are slow.
所以对于rand,你必须看看你的libc,找出实际使用的随机数. Mersenne Twister网站上说它现在应该有相当的速度,但它的特性取决于系统.它没有说明它是如何播种的,这意味着你可以将它用于游戏等,但不能用于其他方面.
mt_rand
Mersenne Twister是一种众所周知的算法,可以产生相当好的分布随机数.它有一个很长的时间段,这意味着在遇到前一个状态之前需要很长时间(如果发生这种情况,它会保持循环,循环的大小称为句点). MT不安全,因为有足够的数据可以重建其安全状态.这意味着如果您首先生成密钥,然后将该算法用于其他内容,则攻击者可以在给定足够输出的情况下重新创建密钥.此外,在创建时使用非安全种子作为系统时间.
openssl_random_pseudo_bytes
OpenSSL的随机数生成器通常是加密安全的(见下面的注释);这意味着在给定发电机输出的情况下不可能重新计算内部状态.
OpenSSL的伪随机数生成器是使用散列函数构造的,当前是MD5,它仍然可以安全地生成随机数.它分布均匀,并且 – 像MT算法一样 – 具有较高的周期. OpenSSL的rand比MT慢得多,但它应该仍然能够获得相当好的速度.
它具有优于OS随机数生成器的优势,它不需要额外的线程或系统调用. OpenSSL使用操作系统随机数生成器(可能的其他源)来创建初始种子. OS随机生成器通常是可用的最佳随机数生成器,因为OS可以访问不直接可用于库和应用程序的熵源.
警告:在OpenSSL的Wiki上声明:
RAND_pseudo_bytes
returns pseudo-random bytes which can be cryptographically strong. The function returns1
if the bytes are cryptographically strong,and0
otherwise. If your application has high integrity requirements,it should not useRAND_pseudo_bytes
.
If passed into the function,this will hold a boolean value that determines if the algorithm used was “cryptographically strong”,e.g.,safe for usage with GPG,passwords,etc.
TRUE
if it did,otherwiseFALSE
这意味着对于例如它可能仍然是不安全的.长期钥匙.
警告#2:其他见解表明,无论返回值如何,OpenSSL的PRNG可能并不总是安全的.因此在选择OpenSSL之前应该特别小心.