手机版

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

时间:2021-09-18 来源:互联网 编辑:宝哥软件园 浏览:

本文分析了生成加密随机数的相关问题。PHP 5没有提供一个简单的机制来生成密码性强的随机数,但是PHP 7通过引入几个CSPRNG函数解决了这个问题。

1.什么是CSPRNG?

引用维基百科,一个密码安全的伪随机数发生器(简称CSPRNG)是一个伪随机数发生器(PRNG),它产生的伪随机数适用于密码算法。

CSPRNG可能主要用于:

密钥生成(例如,复杂的密钥生成)为新用户生成随机密码。获得高级别安全性的关键方面之一是高质量的随机性。

第二,PHP7中的CSPRNG。

PHP 7引入了两个可以用来实现CSPRNG的新函数:random_bytes和random_int。

random_bytes函数返回一个字符串,并接受一个int参数来表示返回结果的字节数。

示例:

$ bytes=random _ bytes(' 10 ');var _ dump(bin2 hex($ bytes));//可能的输出: string(20)' 7dfab 0af 960d 359388 e 6 ' random _ int函数返回指定范围内的整数。

示例:

var_dump(random_int(1,100));//可能的输出: 27 iii。后台运行环境。

上述函数的随机性取决于不同的环境:

在窗口上,总是使用CryptGenRandom()。在其他平台上,如果arc4random_buf()可用,将使用它(在BSD系列或带有libbsd的系统上建立)。如果以上都不成立,将使用linux系统调用getrandom(2)。如果它不起作用,/dev/urandom将被用作最后可用的工具。如果不起作用,系统将抛出一个错误4。一个简单的测试。

一个好的随机数生成系统可以确保正确的生成质量。为了检查这种质量,通常会进行一系列的统计测试。没有必要深入研究复杂的统计课题。将已知行为与数字发生器的结果进行比较有助于质量评估。

一个简单的测试是骰子游戏。假设一次扔1个骰子得到6结果的概率是1/6,如果我同时扔3个骰子100次,结果大致如下:

0 ^ 6=57.9倍,1 ^ 6=34.7倍,2 ^ 6=6.9倍,3 ^ 6=0.5倍。下面是实现掷骰子1,000,000次的代码:

$ times=1000000$ result=[];for($ I=0;$ i $倍;$ I){ $ Dierrol=array(6=0);//只初始化六个计数到零的$ dieRoll[roll()]=1;//第一死$ dieRoll[roll()]=1;//第二个骰子$ dieRoll[roll()]=1;//第三个die $结果[$ dieRoll[6]]=1;//计数sixes }函数roll(){ return random_int(1,6);} var _ dump($ result);使用PHP7的random_int和简单的rand函数可能会得到以下结果。

如果我们看到rand和random_int之间有更好的比较,我们可以应用一个公式在图上画出结果。公式为:(php结果-期望结果)/期望结果的0.5次方。

结果如下:

(接近0的值更好)

虽然三个六的结果不好,而且这个测试对于实际应用来说太简单了,但是我们还是可以看到random _ int的表现要比rand好。

此外,由于随机数生成器的不可预测性和可重复行为,我们的应用程序的安全级别得到了提高。

PHP5呢?

默认情况下,PHP5不提供健壮的随机数生成器。其实还是有一些选择的,比如OpenSSL _ random _ pseudo _ bytes(),mcrypt _ create _ iv()或者直接使用fread()函数来使用/dev/random或者/dev/urandom设备。也有一些包,如RandomLib或libna。

如果你想开始使用一个更好的随机数生成器,同时准备好使用PHP7,你可以使用Paragon Initiative Enterprises Random _ Compat库。random_compat库允许您在php5.xproject中使用random_bytes()和random_int()。

可以通过Composer安装该库:

composer要求paragonie/random _ compat要求“供应商/自动加载”。PHP ';$ string=random _ bytes(32);var _ dump(bin2 hex($ string));//string(64)' 8757 a 27 ce 421 B3 b 9363 b 7825104 F8 BC 8 cf 27 C4 c 3036573 e 50d 4a 91 d2aaec6f ' $ int=random _ int(0,255);var _ dump($ int);//int(81)random_compat库和PHP7使用不同的顺序:

fread()/dev/uran DOM如果可用crypt _ CREATE _ IV($ bytes,MCRYPT_CREATE_IV)COM('CAPICOM .公用事业。1 ')-GetRandom()OpenSSL _ random _ pseudo _ bytes()这个库的一个简单应用用来产生密码:

$ passwordChar=' 0123456789 abcdefghijklmnopqrstuvwxyzabbcdefghijklmnopqrstuvwxyz ';$密码长度=8;$ max=strlen($ passwordChar)-1;$ password=for($ I=0;$ i $ passwordLength$i) { $password .=$passwordChar[random_int(0,$ max)];} echo $ password//可能的输出: 7rgG8GHu总结

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

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

以上就是关于服务器端编程语言(专业超文本预处理器的缩写)随机性的相关内容,希望对大家的学习有所帮助。

版权声明:PHP中的随机性你觉得幸运吗?是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。