【问题标题】:How is PHP's mt_rand seeded?PHP 的 mt_rand 是如何播种的?
【发布时间】:2012-07-06 16:55:32
【问题描述】:

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

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

【问题讨论】:

    标签: php security random mersenne-twister


    【解决方案1】:

    在 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

    【讨论】:

    • 您可能会觉得有趣的是,FreeBSD、OpenBSD 和 OSX 中的 /dev/random/ 由 Fortuna 算法填充,该算法在密码学上是安全的。
    • 从 PHP 源码来看,PHP 的内部 LCG 似乎也播种了时间和 pid,因此不会增加很多随机性。指向 crypto.stackexchange 的链接也非常有启发性。
    • 我想补充一点,对于几乎所有应用程序(包括盐生成),您不需要加密安全的随机数。
    • @Somejan:我没有资格判断,但维基百科关于 MT 的“缺点”部分说,用 LCG 播种 MT 是一个非常好的主意,因为它避免了播种 MT 的问题情况有很多零,需要很长时间才能“突破”该状态。
    • @Jon:用 LCG 播种 MT 以改善生成数字的分布显然是个好主意。但是,出于加密目的,这不会提供任何额外的熵。如果攻击者知道 PID 和时间戳,他就可以轻松预测生成的随机数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2015-04-07
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多