482 / 736CSPRNG

CSPRNG

密码学安全伪随机数生成器

钱包需要一个新的秘密值时,仅仅“看起来随机”的数字并不够。即使攻击者已经看到部分输出,CSPRNG 也应让后续数值在实际计算中难以预测。

CSPRNG 是密码学安全伪随机数生成器。它按照明确的计算过程,从秘密的内部状态生成新数值。“伪随机”不代表质量差:计算可以重复,但不知道秘密状态的人应当无法在实际计算中预测结果。这既需要足够的熵,也就是攻击者对输入仍然存在的不确定性,也需要应用程序正确使用生成器。

设想一个程序正在为钱包生成秘密值。攻击者得知了其中一些较早的输出。安全的生成器不能让这些信息帮助他猜出其余结果。这个要求比图表上的数字分布均匀好看更严格。因此,RFC 4086 区分了密码学强序列和普通的模拟用生成器。即使统计测试成绩很好,只要初始化生成过程的起始值 seed 可以被猜中,安全性仍可能失效。 [1]

技术文档还会使用 DRBG,即确定性随机比特生成器。“确定性”是指相同状态和输入会产生相同结果,因此状态必须保密。NIST SP 800-90A Rev. 1 描述了具体机制:Hash_DRBG、HMAC_DRBG 和 CTR_DRBG。这些是技术过程,并不是对所有提到这些名称的软件颁发的质量认证。审查时还要看配置、熵的来源以及代码的实际实现。 [2]

状态泄露带来两个不同的问题:攻击者能否还原过去的秘密输出?能否预测下一批结果?保护过去输出的能力称为 Backtracking resistance,保护未来输出的能力称为 Prediction resistance。对于后者,NIST SP 800-90A 要求有效加入新的熵,使新结果与已经暴露的状态分离。仅仅再运行一次计算未必能恢复安全。具备其中一种保护,也不自动证明具备另一种。 [2]

库是钱包可以使用的现成软件组件,但调用也可能失败。在 OpenSSL 3.5 中,RAND_bytes() 和 RAND_priv_bytes() 成功时返回 1,其他失败返回 0,当前方法不受支持时返回 -1。熵源失效时,生成操作可能被拒绝。程序必须先检查返回结果,再使用预留的内存区域,也就是缓冲区。否则,它可能使用根本没有安全生成的数据。 [3]

可重复性对测试很有用:开发者需要把结果与预期值比较。因此,libsodium 的 randombytes_buf_deterministic() 会用相同的 seed 生成相同序列。但在正常运行时,意外重复会带来问题。虚拟机快照保存的是计算机的状态,包括内存;恢复快照时,也可能重复生成器的状态和输出。因此,复制运行环境并不意味着一定能生成彼此独立的秘密。 [4]

生成器可能提供了优质随机数据,应用却把它处理错了。如果通过简单取余把数据映射到较小的允许范围,有些结果可能比另一些更常出现。libsodium 的 randombytes_uniform() 通过在指定上界以下均匀选取数值,避免这种偏差。密钥还必须符合所用算法的规则。因此,得到随机字节并不是安全流程的终点,后续如何使用它们同样重要。 [4]

Nonce 是密码学过程中用于一次具体操作的值,但它应遵循什么规则,要由协议决定。RFC 8439 要求同一密钥下不能重复使用 nonce;看起来随机并不保证唯一性。RFC 6979 则描述了如何根据秘密密钥和待签名消息,确定性地计算数字签名所需的值 k。这不是矛盾,而是不同的设计。“到处加入随机性”不能代替正确的协议步骤。 [5] [6]

仅有 CSPRNG 标签,还不能证明钱包正确使用了整套系统。技术审查需要检查具体的库版本、生成器启动方式、错误处理,以及状态恢复或复制后的行为。OpenSSL 和 libsodium 文档说明的是各自函数的性质,而不是每个调用它们的应用都安全。用户还要关注之后的环节:即使秘密生成得完全正确,一旦能够恢复访问权限的备份随后泄露,它也无法继续保护资金。 [3] [4]

要获得更完整的理解,请将本词条与以下词条结合阅读: Cryptographic Entropy, Random Number Generator, Deterministic RNG, Seed Generation. 反向关联还来自: Dice Roll Entropy, Cryptographic Entropy, Random Number Generator, Deterministic RNG.

DOC · 001RFC 4086 — Cryptographically strong sequences规范 DOC · 002NIST SP 800-90A Rev. 1 — DRBG mechanisms and compromise resistance规范 DOC · 003OpenSSL 3.5 — RAND_bytes return values and errors文档 DOC · 004libsodium — Random data and deterministic testing文档 DOC · 005RFC 8439 — Nonce uniqueness规范 DOC · 006RFC 6979 — Deterministic signing规范
修订日期: 来源优先 · 非投资建议