使用 PHP 5.6 在范围内生成安全的随机整数

Wil*_*ill 2 php security random entropy

我想在 PHP5.6$min$maxPHP5.6之间生成一个安全的随机整数。双方rand()mt_rand()在PHP被认为不是密码安全。

文档

警告

此函数不生成加密安全值,不应用于加密目的。如果您需要加密安全值,请考虑改用 random_int()、random_bytes() 或 openssl_random_pseudo_bytes()。

PHP 7 添加了random_int()( docs ),它非常适合我的用例:

random_int — 生成加密安全的伪随机整数

但是如何在 PHP 5.6 中实现这个功能呢?

我天真的尝试是这样的:

<?php
function secure_rand($min, $max)
{
    return (unpack("N", openssl_random_pseudo_bytes(4)) % ($max - $min)) + $min;
}
Run Code Online (Sandbox Code Playgroud)

但我似乎总是在调用时得到“2” secure_rand(1, 100)。我还读到,以这种方式使用模数运算会产生偏差。如何random_int()在 PHP 5.6 中进行模拟?

Sco*_*ski 5

我可以向您介绍random_compat,哪些polyfillsrandom_bytes()random_int()PHP 5 项目?(旁注:在其他项目中,Wordpress 在 4.4 中采用了它。)

function secure_rand($min, $max)
{
    return (unpack("N", openssl_random_pseudo_bytes(4)) % ($max - $min)) + $min;
}
Run Code Online (Sandbox Code Playgroud)

即使这正在做你想要它做的事情,当它不是 2 的偶次幂时,这也是一个有偏随机数生成器($max - $min)