SecureRandom是一个 PHP 库,用于生成安全随机数并将其用于常见的随机化操作,例如打乱数组或生成密码等字符串序列。在 7.0 版本之前,PHP 没有内置的安全随机函数,但仍然可以使用不同的随机源来生成安全随机值。因此,这个库有两个主要目的:
该库不提供任何额外的安全随机字节生成器。它只是使用 PHP 通过扩展或内部可用的字节生成器。 PHP 常用的四种生成器是:
/dev/(u)random
读取mcrypt_create_iv()
函数openssl_random_pseudo_bytes()
函数该库生成的随机性的安全性完全取决于底层随机字节生成器。除了生成随机数均匀分布所需的归一化之外,该库不会对字节进行任何其他转换。
API 文档位于:http://kit.riimu.net/api/securerandom/
OpenSSL
(使用 OpenSSQL 生成器)Mcrypt
(使用 Mcrypt 生成器)/dev/urandom
必须可读才能使用随机读取器生成器安装此库的最简单方法是使用 Composer 来处理依赖项。要通过 Composer 安装此库,只需执行以下两个步骤:
通过在项目根目录中运行 Composer 命令行安装来获取composer.phar
。
运行安装脚本后,项目根目录中应该有composer.phar
文件,并且可以运行以下命令:
php composer.phar require "riimu/kit-securerandom:^1.3"
通过 Composer 安装此库后,您可以通过包含 Composer 在安装过程中生成的vendor/autoload.php
文件来加载该库。
如果您已经熟悉如何使用 Composer,您也可以通过将以下composer.json
文件添加到您的项目并运行composer install
命令来将该库添加为依赖项:
{
"require" : {
"riimu/kit-securerandom" : " ^1.3 "
}
}
如果您不想使用 Composer 加载库,您还可以通过下载最新版本并将src
文件夹解压到您的项目来手动下载库。然后,您可以包含提供的src/autoload.php
文件来加载库类。
该库的使用非常简单。只需创建SecureRandom
的实例并调用任意方法即可生成随机值。例如:
<?php
require ' vendor/autoload.php ' ;
$ rng = new Riimu Kit SecureRandom SecureRandom ();
var_dump ( base64_encode ( $ rng -> getBytes ( 32 ))); // Returns a random byte string
var_dump ( $ rng -> getInteger ( 100 , 1000 )); // Returns a random integer between 100 and 1000
var_dump ( $ rng -> getFloat ()); // Returns a random float between 0 and 1
var_dump ( $ rng -> getRandom ()); // Returns a random float between 0 and 1 (not including 1)
var_dump ( $ rng -> getArray ( range ( 0 , 100 ), 5 )); // Returns 5 randomly selected elements from the array
var_dump ( $ rng -> choose ( range ( 0 , 100 ))); // Returns one randomly chosen value from the array
var_dump ( $ rng -> shuffle ( range ( 0 , 9 ))); // Returns the array in random order
var_dump ( $ rng -> getSequence ( ' 01 ' , 32 )); // Returns a random sequence of 0s and 1s with length of 32
var_dump ( $ rng -> getSequence ([ ' a ' , ' b ' , ' c ' ], 5 )); // Returns an array with 5 elements randomly chosen from 'a', 'b', and 'c'
var_dump ( $ rng -> getUuid ()); // Returns a random version UUID, e.g. '00056a74-036b-47c5-ab35-6f34a41a70ae'
SecureRandom
中提供以下方法来检索随机性:
getBytes($count)
返回长度等于 $count 的随机字节字符串。
getInteger($min, $max)
返回两个给定正整数(含)之间的随机整数。
getFloat()
返回 0 到 1(含)之间的随机浮点值。
getRandom()
返回 0 到 1 之间的随机浮点值,精度为 52 位,因此返回值始终小于 1。与getFloat()
相比,值分布更均匀,并且不依赖于PHP_INT_MAX
。
getArray(array $array, $count)
从给定数组中返回一些随机元素。元素按随机顺序排列,但保留键。
choose(array $array)
返回从数组中选择的随机值。
shuffle(array $array)
以随机顺序返回数组。密钥被保留。
getSequence($choices, $length)
返回值或字符的随机序列。这些选项可以以字符串或数组的形式提供。返回值的类型取决于选择的类型。
getUuid()
返回随机版本 4 通用唯一标识符。 UUID 是可以随机、独立生成的唯一标识符,并且冲突的可能性非常小。 UUID 的示例可以是00056a74-036b-47c5-ab35-6f34a41a70ae
。
该库提供的生成器默认使用/dev/urandom
作为随机源。从/dev/random
读取数据不会为典型的 PHP Web 应用程序提供额外的安全性,并且其阻塞性质使其非常不适合此类目的。
只有少数合法情况下您应该从/dev/random
读取。这主要是如果您担心/dev/urandom
尚未正确播种。然而,Web 应用程序通常不会出现这种情况,因为这往往只在系统启动时出现问题。
如果您知道绝对需要从/dev/random
读取数据,则可以通过将构造函数参数设置为 false 并在构造函数中向SecureRandom
提供生成器来设置RandomReader
和Mcrypt
以将其用作随机源。例如:
<?php
require ' vendor/autoload.php ' ;
$ generator = new Riimu Kit SecureRandom Generator RandomReader ( false );
$ rng = new Riimu Kit SecureRandom SecureRandom ( $ generator );
创建SecureRandom
时,它将尝试使用可用的安全随机生成器之一,具体取决于当前平台支持哪一个。以下随机来源可用,并将按以下顺序尝试:
GeneratorInternal
使用 PHP 7.0 中可用的内部函数GeneratorRandomReader
只是从随机设备/dev/urandom
读取字节GeneratorMcrypt
使用mcrypt_create_iv()
以MCRYPT_DEV_URANDOM
作为源生成随机字节。GeneratorOpenSSL
使用openssl_random_pseudo_bytes()
生成随机字节。关于 OpenSSL 使用的算法实际上在加密方面是否强大存在一些争论。然而,由于缺乏具体的证据反对它,并且由于 PHP 手册中对其强度的影响,该库将默认使用 OpenSSL 作为最后的后备,以实现跨不同平台的更好兼容性。
如果您希望显式定义字节生成器,可以将其作为SecureRandom
的构造函数参数提供。例如:
<?php
require ' vendor/autoload.php ' ;
$ rng = new Riimu Kit SecureRandom SecureRandom (
new Riimu Kit SecureRandom Generator Mcrypt ()
);
该库版权所有 (c) 2014-2017 Riikka Kalliomäki。
有关许可证和复制信息,请参阅许可证。