CSPRNG 是面向密码学用途的确定性生成器。伪随机不等于薄弱:关键是在所述假设下抵抗攻击者的能力。算法、熵源和使用输出的代码必须分别评估。
RFC 4086 区分密码学强序列与普通模拟生成器。知道部分输出不应使剩余输出可被猜出。统计测试本身不能证明这一性质;可预测的 seed 甚至会破坏看起来复杂的输出。 [RFC 4086 — Cryptographically strong sequences]
NIST SP 800-90A Rev. 1 规定了 Hash_DRBG、HMAC_DRBG 和 CTR_DRBG。CSPRNG 标签并不认证每种实现。必须明确机制、参数和熵的获取方式,而不只是散列函数的名称。 [NIST SP 800-90A Rev. 1 — DRBG mechanisms and compromise resistance]
Backtracking resistance 在当前状态泄露后保护先前输出。Prediction resistance 针对未来输出;NIST SP 800-90A 将其与有效注入新鲜熵联系起来。任何一项都不自动意味着另一项,也不意味着再调用一次即可恢复安全。 [NIST SP 800-90A Rev. 1 — DRBG mechanisms and compromise resistance]
OpenSSL 3.5 规定 RAND_bytes() 和 RAND_priv_bytes() 成功返回 1,其他失败返回 0,不支持的方法返回 -1。熵源失败时可能拒绝生成。应用必须检查结果,而不能使用未经确认的缓冲区。 [OpenSSL 3.5 — RAND_bytes return values and errors]
libsodium randombytes_buf_deterministic() 对相同 seed 生成相同序列,例如用于测试。恢复虚拟机快照可能重复状态和输出。测试的可重复性不保证各副本中的秘密相互独立。 [libsodium — Random data and deterministic testing]
libsodium randombytes_uniform() 在上界以下均匀选择,避免简单取余造成的偏差。优质输入字节本身并不保证正确映射到目标范围。密钥还必须遵守相应算法的规则。 [libsodium — Random data and deterministic testing]
RFC 8439 要求同一密钥下不能重复 nonce;看起来随机并不证明唯一性。RFC 6979 则描述确定性生成签名值 k。因此,CSPRNG 并非协议规则的通用替代品。 [RFC 8439 — Nonce uniqueness] [RFC 6979 — Deterministic signing]
记录库版本、机制、初始化、错误以及恢复或克隆状态后的行为。OpenSSL 和 libsodium 文档描述的是各自的特定函数,而非任意钱包的安全性。优质生成也不能阻止备份日后泄露。 [OpenSSL 3.5 — RAND_bytes return values and errors] [libsodium — Random data and deterministic testing]
要获得更完整的理解,请将本词条与以下词条结合阅读: Cryptographic Entropy, Random Number Generator, Deterministic RNG, Seed Generation. 反向关联还来自: Dice Roll Entropy, Cryptographic Entropy, Random Number Generator, Deterministic RNG.