继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

PHP的加密伪随机数生成器的使用

慕侠5032519
关注TA
已关注
手记 210
粉丝 24
获赞 54

今天我们来介绍的是 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() 来将二进制转换成我们可以看懂的十六进制格式字符串。不过由此带来的结果就是我们转换之后的十六进制的字符长度是我们设定的字符长度的 2 倍。这个函数的作用可以为我们生成安全的用户密码 salt 、 密钥关键字 或者 初始化向量。

random_bytes() 每次调用都会生成不同内容的字符串而参数则是字符长度的随机字符在这里我们传递的是 5 返回了 10 个字符可以看出这个参数是字符数量而返回的其实是字节数量对应一个字符占用两个字节的返回形式。或者我们就直接记住它返回的就是参数的两倍即可。至于这个函数的作用嘛可以为我们生成安全的用户密码 salt 、 密钥关键字 或者 初始化向量。

伪随机整数生成

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开始使用CNG-API
  • 在 Linux 系统,会使用 Linux getrandom(2) 系统调用
  • 在其他系统,会使用 /dev/urandom
  • 否则将抛出异常

异常情况

这两个函数也有相应的异常情况会出现比如上面找不到生成来源的话就会抛出异常当然除了这个之外还会有其它的因素也会导致异常的发生。

  • 如果找不到适当的随机性来源将抛出异常
  • 如果给定的参数无效将引发 TypeError
  • 如果给定的字节长度无效将引发错误

总结

今天的内容非常简单而且还发现了 random_bytes() 这个函数的秒用以后不用再自己去写随机生成 salt 的函数了就像我们之间介绍密码加盐文章中 [什么叫给密码“加盐”如何安全的为你的用户密码“加盐”]的那个随机字符生成函数generateSalt基本就可以用这个来替代了。是不是感觉收获满满呢学习的脚步从未停下让我们继续一起探索更好玩的内容吧

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP