`
乱蓬头199303
  • 浏览: 80260 次
文章分类
社区版块
存档分类
最新评论

PHP 中的随机数——你觉得可靠么?

php 
阅读更多

摘要: 本文主要分析以加密为目的的随机数生成问题。PHP 5 并未提供生成强加密随机数的简便机制,但是,PHP 7 引入了两个 CSPRNG 函数以解决该问题。系 OneAPM 工程师编译整理。 PHP 中的随机数——你觉得可靠么? 什么是 CSPRNG? 引用维基百科的定义,密码安全的虚拟随机数生成器(Cryptographically Secure Pseudorandom Number Generator,CSPRNG)是带有特定属性使之在密码学中适用的虚拟随机数生成器(pseudo-random number generator,PRNG)。

本文主要分析以加密为目的的随机数生成问题。PHP 5 并未提供生成强加密随机数的简便机制,但是,PHP 7 引入了两个 CSPRNG 函数以解决该问题。系 OneAPM 工程师编译整理。
screenshot

PHP 中的随机数——你觉得可靠么?

什么是 CSPRNG?

引用维基百科的定义,密码安全的虚拟随机数生成器(Cryptographically Secure Pseudorandom Number Generator,CSPRNG)是带有特定属性使之在密码学中适用的虚拟随机数生成器(pseudo-random number generator,PRNG)。

CSPRNG 主要用于:

生成键(比如:生成复杂的键)
为新的用户账号生成随机密码
加密系统
保证高安全水准的一个重要因素便是高质量的随机数。

PHP 7 中的 CSPRNG

PHP 7 为 CSPRNG 引入了两种新函数:random_bytes 与 random_int。

random_bytes 函数返回 string 类型,并接受一个 int 类型为参数,该参数规定了所返回字符串的字节长度。

例如:

举例:

幕后解密

以上函数的随机数来源因环境不同而有所差异:

在 Windows 系统,会使用 CryptGenRandom() 函数。
在其他平台,会优先使用 arc4random_buf() 函数(限 BSD 衍生系统或带 libbsd 的系统)。
若以上两点均不符合,会使用 Linux getrandom(2) 系统调用。
若以上来源均不符合,会抛出 Error。
一个简例

一个好的随机数生成系统能确保生成质量适合的随机数。为了检验质量,需要运行一系列的统计试验。此处,暂不深入讨论复杂的统计话题,将已知的行为与随机数生成器的结果进行比较,有助于质量评估。

一个简单的测试方法是掷骰游戏。假设投掷一次,投出6的概率是1/6。如果同时投掷三个骰子,投100次,投得零次、一次、两次及三次6的次数大概是:

0 次6 = 57.9 次
1 次6 = 34.7 次
2 次6 = 6.9 次
3 次6 = 0.5 次
以下是骰子投掷100万次的代码:

用 PHP 7 的 random_int 与简单的 rand 函数测试上面的代码,可能会得到:

更直观地查看 rand 与 random_int 的差别,可以运用方程式放大两组结果的差异,并绘制成图表:

php result - expected result / sqrt(expected)
得到的结果如下:
screenshot (结果越接近零越好)

即便三个6的组合表现一般,且该测试与真实应用相比太过简单,我们也能清楚地看到 random_int 的表现优于 rand。况且,随机数生成器的可预见行为、重复行为越少,应用的安全程度就更高。

PHP 5 又如何呢?

默认情况下,PHP 5 并未提供任何强虚拟随机数生成器。而实际使用中,可以使用 openssl_random_pseudo_bytes()、mcrypt_create_iv() 方法,或直接结合使用 /dev/random 或 /dev/urandom 与 fread() 方法。此外,还有包 RandomLib 或 libsodium。

如果你想用一个比较好的随机数生成器,同时能与 PHP 7 兼容,你可以使用 Paragon Initiative 公司的 random_compat 库。该库允许在 PHP 5.x 项目中使用 random_bytes() 与 random_int() 方法。

该库可以使用 Composer 进行安装:

该 random_compat 库使用了与 PHP 7 中不同的优先序列:

想了解为何采用这一优先序列,可以阅读本文档。

使用该库生成密码的简单案例如下:

总结

你应该尽量使用在密码学上安全的虚拟随机数生成器。random_compat 库为此提供了很好的实现方法。

​​​​​​​

原文链接

分享到:
评论

相关推荐

    基于uCOS-II的随机数显示 —— 应用平台Mini2440

    在本文中,我们将深入探讨如何在基于uCOS-II实时操作系统上的Mini2440开发板上实现一个随机数显示的应用程序。这个应用不仅会在LCD指定区域内动态显示随机数字,还会实时监控系统性能,如任务总数、CPU使用率,并...

    C# 控制台应用程序——随机数

    1)开发时,在解决方案中,鼠标右键选择项目,然后点选“属性”,在“调试”项目中的“命令行参数”里面,可以预先输入需在命令行接收的参数,这样开发的时候就可以直接读入了。注意,不用对这些参数进行校验,默认...

    电脑随机数是如何生成的?.docx

    电脑随机数是如何生成的?.docx

    实例008——产生随机数.zip

    本实例008——产生随机数,旨在探讨如何在不同的编程语言中生成随机数,以及随机数生成器的基本原理和使用技巧。 首先,我们要理解随机数的定义:它是一个在一定范围内无法预测的数值。在计算机科学中,虽然数字是...

    深入理解随机数的产生——用c语言产生随机数rand().doc

    "深入理解随机数的产生——用C语言产生随机数rand()" 随机数是一种非常重要的概念,在计算机科学中有着广泛的应用。C语言中提供了rand()函数来产生伪随机数,但这并不是真正的随机数,而是一个根据种子值递推公式...

    数组应用——随机数生成器

    在这个“数组应用——随机数生成器”的主题中,我们将深入探讨如何利用数组来处理随机数,并找到其中的最大值及其索引。这个任务涉及到两个主要的知识点:随机数生成和数组操作。 首先,随机数生成是计算机科学中一...

    一小软件——随机数产生器

    很不错的一随机数产生器,自主研发!自己做的,刚学不究,请见谅!

    ACM 入门——字符串处理及随机数

    在ACM竞赛或算法编程中,字符串处理和随机数生成是常见的任务,因此了解这些基础知识至关重要。下面将详细解释上述提到的一些字符串处理函数和随机数的生成方法。 首先,`memset`函数用于将内存区域初始化为特定值...

    PHP随机数 C扩展随机数

    在PHP编程中,随机数是常见的需求,特别是在生成唯一标识符、加密、模拟随机行为等场景。本篇文章将深入探讨PHP中的随机数生成,并重点介绍C扩展随机数以及PHP唯一ID生成扩展ukey。 首先,PHP提供了一些内置函数来...

    excel中批量设置随机数

    下面我们将详细介绍如何通过VBA在Excel中批量设置具有特定基数、浮动值和保留位数的随机数。 1. **理解VBA基础** VBA是Excel内置的一种编程语言,允许用户自定义功能和自动化任务。通过编写VBA代码,我们可以控制...

    随机数随机数随机数随机数

    随机数随机数随机数随机数随机数随机数随机数随机数

    随机数自检-扑克检测

    在IT行业中,随机数生成是许多算法和应用的基础,如模拟、加密、游戏开发等。在C#编程语言中,生成随机数的过程涉及到System.Random类的使用。本项目"随机数自检-扑克检测"旨在通过一个实际的扑克牌检测案例来验证...

    国密随机数检测工具,随机数检测

    国密随机数检测工具,随机数检测

    Keil C51 中产生随机数的方法

    在Keil C51开发环境中,生成随机数是嵌入式系统编程中常见的需求,尤其在游戏、加密算法、测试工具等领域。本文将详细介绍在Keil C51中如何使用标准库函数`rand()`和`srand()`来生成随机数,并通过实例代码进行演示...

    MFC实现产生随机数

    总结起来,通过MFC在VC++中实现生成随机数的功能,你需要创建一个MFC对话框应用程序,添加一个按钮控件,处理按钮点击事件,然后在事件处理函数中使用C++的标准库生成随机数。这个过程涉及了MFC的消息映射、控件交互...

    java 求最大的随机数

    如果你想找到一系列随机数中的最大值,你可以创建一个变量来保存当前的最大值,然后用每个新生成的随机数与之比较。以下是一个例子: ```java int maxNumber = Integer.MIN_VALUE; // 初始化为最小整数值 for ...

    c++中生成随机数

    在C++编程语言中,生成随机数是一项基本且常见的任务,尤其在模拟、游戏开发、数据分析等场景中。本文将详细讲解如何在C++中生成随机数,包括设置上限和下限,以及如何正确地使用`rand()`函数。 首先,C++标准库...

Global site tag (gtag.js) - Google Analytics