paragonie / seedspring
基于种子的确定性随机数生成器
v1.2.1
2024-05-08 16:49 UTC
Requires
- php: >= 5.6
- ext-openssl: *
- paragonie/constant_time_encoding: ^1|^2|^3
- paragonie/random_compat: >=2
Requires (Dev)
- phpunit/phpunit: ^5|^6|^7|^8|^9
- vimeo/psalm: ^1|^2|^3|^4
README
基于种子的确定性PRNG(基于AES-CTR而非LCG)(需要PHP 7或random_compat)
安全警告
这不是用来替换 random_bytes()
的。把它看作是对 srand()
+ rand()
的改进。不要将其用于安全目的。
安装
composer require paragonie/seedspring
用法
use \ParagonIE\SeedSpring\SeedSpring; // For example $sharedSeed = str_repeat("\x80", 16); $rng = new SeedSpring($sharedSeed); $data = $rng->getBytes(1024); $int = $rng->getInt(1, 100);
动机
对于安全目的,一个加密安全的伪随机数生成器,如 random_int()
,是非常好的。然而,在某些情况下,您需要在两个设备上从共享的种子生成一个确定性的伪随机字节流。(例如,类似于Minecraft的世界生成器)。
PHP的本地可播种的(且不安全)的RNG,rand()
和 mt_rand()
,只支持32位整数种子,这严重限制了可能的输出。我们的确定性RNG支持高达2^128种可能的输出,因为它基于128位块加密。
我们的实现使用AES-128-CTR将有限的128位密钥转换成一个实际上无限的随机字节流。
输出2^132字节后会重复。您应该在输出2^66字节后考虑重新加密。
对于任何安全敏感的用途,您应该在输出2^39字节后重新加密。这是因为预测连续块的概率对于安全操作变得不可接受。