微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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之前应该特别小心.

原文地址:https://www.jb51.cc/php/133617.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐