【发布时间】:2012-07-06 16:55:32
【问题描述】:
我知道 PHP 的 mt_rand() 不应该用于安全目的,因为它的结果在密码学上并不强。然而,很多 PHP 代码就是这样做的,或者在没有更好的随机性来源时将其用作后备。
那么它有多糟糕? mt_rand 用于播种的随机性来源是什么?对于加密应用程序,mt_rand 是否存在其他安全问题?
【问题讨论】:
标签: php security random mersenne-twister
我知道 PHP 的 mt_rand() 不应该用于安全目的,因为它的结果在密码学上并不强。然而,很多 PHP 代码就是这样做的,或者在没有更好的随机性来源时将其用作后备。
那么它有多糟糕? mt_rand 用于播种的随机性来源是什么?对于加密应用程序,mt_rand 是否存在其他安全问题?
【问题讨论】:
标签: php security random mersenne-twister
在 PHP 5.4 中,如果 mt_rand 在第一次使用时自动播种 (PHP source)。 seed value 是当前时间戳、PHP 进程 PID 和 PHP 内部 LCG 生成的值的函数。我没有检查以前版本的 PHP 的源代码,但 documentation 暗示这个种子算法从 PHP 5.2.1 开始就已经在使用了。
mt_rand 背后的 RNG 算法是Mersenne Twister。谈论它“有多糟糕”并没有真正的意义,因为它已明确记录(不幸的是,不是在 PHP 文档页面上)它完全不适合加密应用程序。如果您想要加密强度随机性,请使用记录在案的加密强度生成器。
更新:您可能还想查看来自 crypto.SE 的 this question。
【讨论】:
/dev/random/ 由 Fortuna 算法填充,该算法在密码学上是安全的。