加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_镇江站长网 (https://www.0511zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP中的随机性——你觉得自己幸运吗?

发布时间:2016-01-30 21:48:51 所属栏目:PHP教程 来源:网络整理
导读:你总是应该使用一个密码学上安全的伪随机数生成器,random_compat 库提供了一种好的实现。如果你想要使用可靠的随机数据源,如你在本文所见,建议尽快使用 random_int 和 random_bytes.

结果图如下:

PHP中的随机性——你觉得自己幸运吗?

(接近0的值更好)

尽管3个6的结果表现不好,并且这个测试对实际应用来说太过简单我们仍可以看出 random_int 表现优于 rand.

进一步,我们的应用的安全级别由于不可预测性和随机数发生器的可重复行为而得到提升。

PHP5 呢

缺省情况下,PHP5 不提供强壮的随机数发生器。实际上,还是有选择的比如 openssl_random_pseudo_bytes(), mcrypt_create_iv() 或者直接使用fread()函数来使用 /dev/random 或 /dev/urandom 设备。也有一些包比如 RandomLib 或 libsodium.

如果你想要开始使用一个更好的随机数发生器并且同时准备好使用PHP7,你可以使用Paragon Initiative Enterprises random_compat 库。 random_compat 库允许你在 PHP 5.x project.使用 random_bytes() and random_int()

这个库可以通过Composer安装:

  1. composer require paragonie/random_compat 
  2.  
  3. require 'vendor/autoload.php'
  4. $string = random_bytes(32); 
  5. var_dump(bin2hex($string)); 
  6. // string(64) "8757a27ce421b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2aaec6f" 
  7. $int = random_int(0,255); 
  8. var_dump($int); 
  9. // int(81) 

random_compat 库和PHP7使用不同的顺序:

  1. fread() /dev/urandom if available 
  2. mcrypt_create_iv($bytes, MCRYPT_CREATE_IV) 
  3. COM('CAPICOM.Utilities.1')->GetRandom() 
  4. openssl_random_pseudo_bytes() 

想知道为什么是这个顺序建议阅读 documentation.

这个库的一个简单应用用来产生密码:

  1. $passwordChar = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  2. $passwordLength = 8
  3. $max = strlen($passwordChar) - 1
  4. $password = ''
  5. for ($i = 0; $i < $passwordLength; ++$i) { 
  6.     $password .= $passwordChar[random_int(0, $max)]; 
  7. echo $password; 
  8. //possible output: 7rgG8GHu 

总结

你总是应该使用一个密码学上安全的伪随机数生成器,random_compat 库提供了一种好的实现。

如果你想要使用可靠的随机数据源,如你在本文所见,建议尽快使用 random_int 和 random_bytes.

译文链接:http://www.codeceo.com/article/php-random.html
英文原文:Randomness in PHP – Do You Feel Lucky?

(编辑:应用网_镇江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!