• 技术文章 >后端开发 >PHP问题

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

    醉折花枝作酒筹醉折花枝作酒筹2021-05-27 18:10:51转载254
    本篇文章给大家介绍一下PHP使用加密伪随机数生成器的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

    今天我们来介绍的是 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)基本就可以用这个来替代了。是不是感觉收获满满呢,学习的脚步从未停下,让我们继续一起探索更好玩的内容吧!!

    测试代码:

    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

    推荐学习:php视频教程

    以上就是PHP如何使用加密伪随机数生成器的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:php
    上一篇:php中yield的用法是什么 下一篇:PHP如何生成与识别二维码
    大前端线上培训班

    相关文章推荐

    • PHP while循环该如何使用呢?(附详解)• 如何处理​PHP 表单?如果是你你会怎样处理呢?• php如何设置程序运行时间• 有关于PHP数组的进一步了解!!!• php中yield的用法是什么

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网