《PHP应用:PHP中的随机性 你觉得自己幸运吗?》要点:
本文介绍了PHP应用:PHP中的随机性 你觉得自己幸运吗?,希望对您有用。如果有疑问,可以联系我们。
本文分析了生成用于加密的随机数的相关问题. PHP 5没有提供一种简单的机制来生成暗码学上强壮的随机数,但是PHP 7通过引入几个CSPRNG函数来解决了这个问题.PHP学习
PHP学习
一、什么是CSPRNGPHP学习
引用维基百科,一个密码学上平安的伪随机数发生器(Cryptographically Secure Pseudorandom Number Generator 缩写CSPRNG)是一个伪随机数生成器(PRNG),其生成的伪随机数适用于密码学算法.PHP学习
CSPRNG可能主要用于:PHP学习
获得高级别平安性的一个关键方面就是高品质的随机性PHP学习
二、PHP7 中的CSPRNGPHP学习
PHP 7引入了两个新函数可以用来实现CSPRNG: random_bytes 和 random_int.PHP学习
random_bytes 函数返回一个字符串,接受一个int型入参代表返回结果的字节数.PHP学习
例子:PHP学习
$bytes = random_bytes('10'); var_dump(bin2hex($bytes)); //possible ouput: string(20) "7dfab0af960d359388e6"
random_int 函数返回一个指定范围内的int型数字.PHP学习
例子:PHP学习
var_dump(random_int(1, 100)); //possible output: 27
三、后台运行环境PHP学习
以上函数的随机性不同的取决于环境:PHP学习
四、一个简单的测试PHP学习
一个好的随机数生成系统保证合适的产生“质量”.为了检查这个质量, 通常要执行一连串的统计测试.不需要深入研究复杂的统计主题,比较一个已知的行为和数字生成器的结果可以赞助质量评价.PHP学习
一个简单的测试是骰子游戏.假设掷1个骰子1次得到结果为6的概率是1/6,那么如果我同时掷3个骰子100次,得到的结果粗略如下:PHP学习
0 个6 = 57.9 次
1 个6 = 34.7次
2 个6 = 6.9次
3 个6 = 0.5次
以下是是实现实现掷骰子1,000,000次的代码:PHP学习
$times = 1000000; $result = []; for ($i=0; $i<$times; $i++){ $dieRoll = array(6 => 0); //initializes just the six counting to zero $dieRoll[roll()] += 1; //first die $dieRoll[roll()] += 1; //second die $dieRoll[roll()] += 1; //third die $result[$dieRoll[6]] += 1; //counts the sixes } function roll(){ return random_int(1,6); } var_dump($result);
用PHP7 的 random_int 和简单的 rand 函数可能得到如下结果PHP学习
PHP学习
如果先看到rand 和 random_int 更好的比较我们可以应用一个公式把结果画在图上.公式是:(php结果-期待的结果)/期待结果的0.5次方.PHP学习
结果图如下:PHP学习
PHP学习
(接近0的值更好)PHP学习
尽管3个6的结果表现不好,并且这个测试对实际应用来说太过简单我们仍可以看出 random_int 表现优于 rand.PHP学习
进一步,我们的应用的平安级别由于不可预测性和随机数发生器的可重复行为而得到提升.PHP学习
PHP5 呢PHP学习
缺省情况下,PHP5 不提供强壮的随机数发生器.实际上,还是有选择的比如 openssl_random_pseudo_bytes(), mcrypt_create_iv() 或者直接使用fread()函数来使用 /dev/random 或 /dev/urandom 设备.也有一些包比如 RandomLib 或 libsodium.PHP学习
如果你想要开始使用一个更好的随机数发生器并且同时准备好使用PHP7,你可以使用Paragon Initiative Enterprises random_compat 库. random_compat 库允许你在 PHP 5.x project.使用 random_bytes() and random_int()PHP学习
这个库可以通过Composer安装:PHP学习
composer require paragonie/random_compat require 'vendor/autoload.php'; $string = random_bytes(32); var_dump(bin2hex($string)); // string(64) "8757a27ce421b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2aaec6f" $int = random_int(0,255); var_dump($int); // int(81)
random_compat 库和PHP7使用不同的顺序:PHP学习
fread() /dev/urandom if available mcrypt_create_iv($bytes, MCRYPT_CREATE_IV) COM('CAPICOM.Utilities.1')->GetRandom() openssl_random_pseudo_bytes()
这个库的一个简单应用用来产生暗码:PHP学习
$passwordChar = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $passwordLength = 8; $max = strlen($passwordChar) - 1; $password = ''; for ($i = 0; $i < $passwordLength; ++$i) { $password .= $passwordChar[random_int(0, $max)]; } echo $password; //possible output: 7rgG8GHu
总结PHP学习
你总是应该使用一个密码学上平安的伪随机数生成器,random_compat 库提供了一种好的实现.PHP学习
如果你想要使用可靠的随机数据源,如你在本文所见,建议尽快使用 random_int 和 random_bytes.PHP学习
以上就是关于php随机性的相关内容,希望对大家的学习有所赞助.PHP学习
维易PHP培训学院每天发布《PHP应用:PHP中的随机性 你觉得自己幸运吗?》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/7650.html