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 中进行模拟?
我可以向您介绍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)。