今天介绍PHP中的加密伪随机数生成器(CSPRNG扩展)。随机数的生成其实很简单,只需要使用rand()或者mt_rand()函数即可,但是我们今天要说的是一套使用了更复杂算法的随机数生成器。不再推荐rand()。mt_rand()生成速度更快,现在是主流功能。加密的伪随机数生成函数在密码学上是安全的,并且比mt_rand()稍慢。它需要依赖操作系统的一些功能,这个我们后面会讲到。此加密扩展已经集成在PHP7中,不需要特殊安装。如果是PHP7以下的版本,需要单独安装扩展。如果您在测试时找不到下面描述的功能,请检查您当前的PHP版本。伪随机字符生成var_dump(bin2hex(random_bytes(5)));//string(10)"f28dc2bdd5"var_dump(random_bytes(5));//string(5)"??"??"random_bytes()每次调用会生成不同内容的二进制字符串,参数为二进制的字节长度,直接得到的二进制数据是乱码格式,所以一般我们需要使用bin2hex()将二进制转换成我们能看懂的东西十六进制格式的字符串。但是结果是转换后的十六进制字符的长度是我们设置的字符长度的两倍。这个函数的作用可以为我们生成安全的用户密码salt,key关键字或者初始化向量。random_bytes()会生成每次调用时内容不同的字符串,参数是一个字符长度的随机字符,这里传入5,返回10个字符,可以看出这个参数是字符个数,返回的是什么实际上是byt的个数es,对应一个字符占用两个字节的返回形式。或者我们可以只记住它返回两倍数量的参数。至于这个函数嘛,它可以为我们生成一个安全的用户密码salt,key关键字或者初始化向量。伪随机整数生成var_dump(random_int(100,999));var_dump(random_int(-1000,0));//int(900)//int(-791)对于整数的生成就更简单了,因为random_int()函数提供了两个参数,即随机整数的范围。其实和mt_rand()的用法是一样的。生成源上述两个密码学伪随机函数的生成源取决于操作系统,具体如下:在Windows系统中,会用到CryptGenRandom()函数。从7.2.0开始,Linux系统将使用CNG-API,使用Linuxgetrandom(2)系统调用。在其他系统中,将使用/dev/urandom,否则将抛出异常。这两个函数也有相应的异常,比如上面找不到生成源,就会抛出异常。当然除此之外的其他因素也会导致异常的发生。如果找不到合适的随机源,将抛出异常如果给出无效参数,将引发TypeError如果给出无效字节长度,将抛出错误此函数在几秒钟内使用,你不以后需要自己写一个随机生成salt的函数吗,就像介绍密码加盐的文章中什么是“加盐”密码一样?如何安全地“加盐”您的用户密码?随机字符生成函数(generateSalt)基本可以用这个代替。是不是觉得收获颇丰呢,学习的脚步从未停止,让我们一起继续探索更多有趣的内容吧!!测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84%E5%8A%A0%E5%AF%86%E4%BC%AA%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90%E5%99%A8%E7%9A%84%E4%BD%BF%E7%94%A8.php参考文档:https://www.php.net/manual/zh/book.csprng.php各媒体平台均可搜索【硬核项目经理】
