【问题标题】:How to use /dev/urandom with PHP to get CS random numbers如何在 PHP 中使用 /dev/urandom 来获取 CS 随机数
【发布时间】:2015-10-26 22:34:51
【问题描述】:

我需要创建介于 0 和 10,000,000 之间的随机整数,并且需要数百万个这样的数字。这些数字必须尽可能接近 CSPRNG,因为这应该(例如)有人能够阅读,因此 200 万个这样的数字中有 100 万个他们会发现计算剩余的 100 万个数字是不切实际的。

经过一些研究,我得出的结论是,使用我可用的工具,使用 /dev/urandom 的 (Unix/PHP) 将是我最好的选择。

我遇到了这个解决方案:

// equiv to rand, mt_rand
// returns int in *closed* interval [$min,$max]
function devurandom_rand($min = 0, $max = 0x7FFFFFFF) {
    $diff = $max - $min;
        if ($diff < 0 || $diff > 0x7FFFFFFF) {
    	throw new RuntimeException("Bad range");
        }
        $bytes = mcrypt_create_iv(4, MCRYPT_DEV_URANDOM);
    if ($bytes === false || strlen($bytes) != 4) {
        throw new RuntimeException("Unable to get 4 bytes");
    }
    $ary = unpack("Nint", $bytes);
    $val = $ary['int'] & 0x7FFFFFFF;   // 32-bit safe
    $fp = (float) $val / 2147483647.0; // convert to [0,1]
    return round($fp * $diff) + $min;
}

来源:https://codeascraft.com/2012/07/19/better-random-numbers-in-php-using-devurandom/

鉴于我需要创建大量随机数,我是否最好将 /dev/urandom 管道传输到文件,然后一次读取 3 个字节(2^24 = 1600 万)并转换转整数?

这两种解决方案都适合我的需求吗?

【问题讨论】:

    标签: php security random


    【解决方案1】:

    当 PHP 7 出现时,它有一个名为 random_int() 的新函数可以用于此目的。

    如果您今天需要这个(即在 PHP 5 项目中),请查看 random_compat

    至少,看看random_compat 中的how random_int() is implemented。除其他原因外,它仍然适用于大于PHP_INT_MAX 的范围。 (是的,它使用/dev/urandom。)

    演示:http://3v4l.org/VJGCb

    【讨论】:

    • 非常感谢,很高兴看到我在 /dev/urandom 的正确轨道上 - 您代码中的一个链接已经在我的书签中 (sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers)。我确实知道 random_int() 但仍在使用 PHP5 并且今天确实需要它。我将使用 random_compat - 它能够在 250 秒内生成 10M 数字,并且在我的服务器上它使用 $fp = fopen('/dev/urandom', 'rb') 源。在一个简单的 for 循环中多次调用 random_int() 会影响随机性的“质量”吗?
    • 我不相信 Linux 手册页关于熵耗尽的迷信。应该没问题
    • 谢谢 Scott - 我正在使用 freeBSD 我想这也可以吗? PS试图支持你的答案,但不允许我。
    • 是的,如果 FreeBSD 在这方面比 Linux 更明智的话。我的意思是,他们的 TCP/IP 堆栈一直是漏洞的来源,但如果他们不随机做出更好的决策,那该死的。
    • @Paul urandom(就目前所知,是一个很好的 csprng)不会用完熵。也就是说,一旦收集到足够量的熵,即使没有获得任何新信息,它也不允许从几乎任何数量的输出中推断出内部状态(或者更确切地说,这样做需要攻击者枚举更多可能的内部状态,然后他才能在任何合理(想想千年)的时间)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多