在 PHP 中生成不可预测的随机数对于许多应用程序至关重要,例如生成密码、创建游戏中的随机事件,或模拟现实世界中的现象。
PHP 提供了几个内置函数来生成随机数,但需要注意的是,这些函数可能不是完全不可预测的,特别是如果它们基于伪随机数生成器 (PRNG)。PRNG 使用算法从给定的种子生成一系列数字,而种子通常是时间戳或其他可预测的值。
为了生成真正不可预测的随机数,我们需要使用其他方法,例如从外部来源获取熵或利用硬件随机数生成器 (HRNG)。
PHP 的 OpenSSL 扩展提供了
openssl_random_pseudo_bytes()
函数,它使用OpenSSL 库来生成加密安全的伪随机字节。这些字节基于多种熵源,例如操作系统时间、进程 ID 和用户输入,从而提供了更高的不可预测性级别。
以下是使用
openssl_random_pseudo_bytes()
生成不可预测随机数的示例代码:
这将输出一个 64 个字符的十六进制字符串,代表一个不可预测的 256 位随机数。
另一个生成不可预测随机数的方法是从外部来源获取熵。这可以通过从用户收集输入、读取环境变量或使用专门的熵收集库来实现。
例如,我们可以使用
/dev/urandom
特殊文件来收集熵,该文件在 Unix 系统上可用。以下是使用
/dev/urandom
生成不可预测随机数的示例代码:
请注意,在 Windows 系统上,可以使用
CryptGenRandom()
函数从加密服务提供程序 (CSP) 获取熵。
硬件随机数生成器 (HRNG) 是专门的硬件设备,旨在生成真正的随机数。它们利用自然现象(例如热噪声或量子隧穿)来创建不可预测的位序列。
PHP 不直接提供对 HRNG 的访问,但我们可以通过安装第三方扩展或使用系统调用来访问它们。
RandomLib 是一个 PHP 扩展,它提供对各种 HRNG 设备的访问。要使用 RandomLib,我们需要先安装它:
bash composer require randomlib/randomlib我们可以使用 RandomLib 来生成不可预测的随机数:
php getGenerator(); $randomNumber = $generator->generate(32); echo $randomNumber; ?>
RandomLib 支持多种 HRNG 设备,包括
/dev/urandom
、英特尔 RDRAND 指令和 windows CryptoAPI。它将自动检测并使用最可用的设备。
在某些系统上,我们可以直接使用系统调用来访问 HRNG。在 Unix 系统上,我们可以使用
getrandom()
系统调用:
在 Windows 系统上,我们可以使用
BCryptGenRandom()
函数:
请注意,这些系统调用仅在支持它们的系统上可用。
有时,我们需要将随机数导出到文件中以供以后使用。我们可以使用 PHP 的
file_put_contents()
函数来实现这一点:
random_numbers.txt
的文件,其中包含不可预测的随机数。
用 PHP 生成不可预测的随机数至关重要,特别是对于需要高安全性或不可预测性的应用程序。通过使用 OpenSSL 扩展、从外部来源获取熵或利用硬件随机数生成器,我们可以生成真正不可预测的随机数,从而增强应用程序的安全性、可靠性和可用性。
本文地址:https://www.badfl.com/article/e9277d8223ebc2428acf.html