今天我们来介绍的是 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

参考文档:

https://www.php.net/manual/zh/book.csprng.php

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

PHP的加密伪随机数生成器的使用的更多相关文章

  1. Silverlight信息加密 - 通过Rfc2898DeriveBytes类使用基于HMACSHA1的伪随机数生成器实现PBKDF2

    原文: http://blog.csdn.net/xuyue1987/article/details/6706600 在上一篇文章当中,介绍到了通过Silverlight获取web.config中的值 ...

  2. [MCSM]伪随机数和伪随机数生成器

    1. 几个问题 为什么需要随机数? 伪随机数伪在哪里? 为何要采用伪随机数代替随机数?这种代替是否有不利影响? 如何产生(伪)随机数? 以下内容将围绕这几个问题依次说明. 2. 参考 http://e ...

  3. d3 数学方法(伪随机数生成器 )

    一.正态(高斯)分布(normal (Gaussian) distribution)的随机数 /* var nomarlRandmo = d3.random.normal(); console.log ...

  4. 第12.4节 Python伪随机数数生成器random模块导览

    random模块实现了各种分布的伪随机数生成器,常用功能包括: random.seed(a=None, version=2):初始化随机数生成器,如果 a 被省略或为 None ,则使用当前系统时间. ...

  5. [Node.js] 对称加密、公钥加密和RSA

    原文地址:http://www.moye.me/2015/06/14/cryptography_rsa/ 引子 对于加解密,我一直处于一种知其然不知其所以然的状态,项目核心部分并不倚重加解密算法时,可 ...

  6. SSL/TLS 高强度加密: 常见问题解答

    关于这个模块 mod_ssl 简史 mod_ssl会受到Wassenaar Arrangement(瓦森纳协议)的影响吗? mod_ssl 简史 mod_ssl v1 最早在1998年4月由Ralf ...

  7. [转载] TLS协议分析 与 现代加密通信协议设计

    https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...

  8. C#简单的加密类

    1.加密 public class EncryptHepler { // 验值 static string saltValue = "XXXX"; // 密码值 static st ...

  9. 加密解密以及CA签证

    在当今互联网时代,数据越来越来重要.那么如何加密?解密?以及通过什么方式来认证了?? 接下来,我就会和大家谈谈加密,解密以及CA签证的实现. 首先大家的知道一些加密,解密的基本常识: 互联网上中间人一 ...

随机推荐

  1. Mysql数据库优化(1)

    1.尽量不要留null select id from t where num is null,可以,但尽量不要留null,null也占空间:使用not null填充数据库,像varchar(100)这 ...

  2. Linux下基于SQLite3 实现商店商品管理系统

    文章目录 一.SQLite相关C接口 重要接口 打开数据库 插入信息 查询 二.程序要求 三.程序说明 四.实现代码 水果店账单管理系统 一.SQLite相关C接口 如果第一次直接在命令行安装sqli ...

  3. noip22

    T1 考试的时候打的特殊性质分,然而暴力竟然写假了. 正解: 显然是个贪心,要最大化 \(a_{\min}\times b_{\min}\),肯定是要删掉若干个 \(a\) 最小,\(b\) 最小的矩 ...

  4. TCP三次握手中SYN,ACK,Seq含义

    TCP(Transmission Control Protocol)传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示 ...

  5. C# 正则表达式的重点知识 1

  6. WPF Tree多级绑定

    <Window x:Class="TreeTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/20 ...

  7. Json序列化更新好友列表

    一.概述 使用Newtonsoft.Json开源库进行序列化 二.代码 using Newtonsoft.Json; using System; using System.Collections.Ge ...

  8. C# Monitor.TryEnter 源码跟踪

    source: Monitor 获取指定对象的独占锁. [MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical, __Dyn ...

  9. Maven项目管理工具--简单实用与入门

    Maven管理的方式就是"自动下载项目所需要的jar包,统一管理jar包之间的依赖关系" Maven下载与安装 1.首先确保JDK已安装,且JDK为1.6+(尽量新,新肯定支持,旧 ...

  10. Ubuntu 配置、使用samba共享文件夹

    安装库 sudo apt install smbclient samba samba-common 启动samba sudo /etc/init.d/samba start 备份配置文件 sudo c ...