paragonie/seedspring

基于种子的确定性随机数生成器

v1.2.1 2024-05-08 16:49 UTC

This package is auto-updated.

Last update: 2024-09-08 17:27:27 UTC


README

Build Status

基于种子的确定性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字节后重新加密。这是因为预测连续块的概率对于安全操作变得不可接受。