PHP';兰德山的种子是什么?

PHP';兰德山的种子是什么?,php,security,random,mersenne-twister,Php,Security,Random,Mersenne Twister,我知道PHP的mt_rand()不应该用于安全目的,因为它的结果在加密方面并不强大。然而,很多PHP代码就是这样做的,或者如果没有更好的随机性来源,就使用它作为后备 那么情况有多糟?mt_rand用于播种的随机性来源是什么?对于加密应用程序,mt_rand是否存在其他安全问题 在PHP5.4中,如果mt_rand在第一次使用时自动进行种子设定()。是当前时间戳、PHP进程PID和PHP内部进程生成的值的函数。我没有检查PHP以前版本的源代码,但是这意味着这个种子算法已经从PHP5.2.1开始使用

我知道PHP的
mt_rand()
不应该用于安全目的,因为它的结果在加密方面并不强大。然而,很多PHP代码就是这样做的,或者如果没有更好的随机性来源,就使用它作为后备


那么情况有多糟?
mt_rand
用于播种的随机性来源是什么?对于加密应用程序,
mt_rand
是否存在其他安全问题

在PHP5.4中,如果
mt_rand
在第一次使用时自动进行种子设定()。是当前时间戳、PHP进程PID和PHP内部进程生成的值的函数。我没有检查PHP以前版本的源代码,但是这意味着这个种子算法已经从PHP5.2.1开始使用

mt_rand
背后的RNG算法是。谈论它“有多糟糕”是没有意义的,因为它清楚地记录了(不幸的是,不是在PHP文档页面上)它完全不适合加密应用程序。如果需要加密强度随机性,请使用有文档记录的加密强度生成器


更新:您可能还想从crypto.SE查看。

您可能会发现有趣的是,FreeBSD、OpenBSD和OSX中的
/dev/random/
是由Fortuna算法填充的,这是加密安全的。根据PHP源代码,PHP的内部LCG似乎也包含时间和pid,所以它不会增加很多随机性。指向crypto.stackexchange的链接也很有启发性。我想补充一点,几乎所有应用程序(包括salt生成)都不需要加密安全的随机数。@Somejan:我没有资格判断,但维基百科的“缺点”关于机器翻译的一节说,使用LCG为机器翻译播种是一个非常好的主意,因为它避免了机器翻译播种大量零,并且需要花费大量时间才能“突破”该状态的问题。@Jon:显然,使用LCG为机器翻译播种是一个好主意,以改善生成数字的分布。然而,出于加密目的,这并不提供任何额外的熵。如果攻击者知道PID和时间戳,他也可以轻松预测生成的随机数。