php – 是什么让openssl_random_pseudo_bytes“加密安全”?

前端之家收集整理的这篇文章主要介绍了php – 是什么让openssl_random_pseudo_bytes“加密安全”?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我总是被告知在给密码盐时我应该使用openssl_random_pseudo_bytes.

但我真正想知道的是,它使加密安全的原因. rand,mt_randopenssl_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 returns 1 if the bytes are cryptographically strong,and 0 otherwise. If your application has high integrity requirements,it should not use RAND_pseudo_bytes.

这反映在PHP函数中:

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,otherwise FALSE

这意味着对于例如它可能仍然是不安全的.长期钥匙.

警告#2:其他见解表明,无论返回值如何,OpenSSL的PRNG可能并不总是安全的.因此在选择OpenSSL之前应该特别小心.

猜你在找的PHP相关文章