如何使用PHP的/ dev / urandom获取CS随机数

时间:2015-08-04 13:25:48

标签: php security random

我需要在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万)并转换整数?

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

1 个答案:

答案 0 :(得分:2)

当PHP 7问世时,它有一个名为random_int()的新功能,用于此目的。

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

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

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