481 / 736RNG

Random Number Generator

随机数生成器

钱包创建新秘密时,需要别人无法猜出的数字。随机数生成器帮助提供这些数字,但并不是所有生成器都适合保护资金。

Random Number Generator,简称 RNG,是生成数值的设备或程序。钱包需要密码学安全的生成器:即使攻击者知道先前的结果或创建时间,也不能在实际可行的成本内预测新秘密。这取决于熵源、算法以及应用程序使用它们的方式。这里的熵描述的是攻击者对结果仍然存在的不确定性。

假设钱包只用当前时间来派生秘密。结果可能看起来很复杂,但知道钱包创建时间的人,需要尝试的可能性会少得多。RFC 4086 正是提醒我们警惕这种可预测的输入。因此,适合游戏或模拟的生成器未必适合生成密钥。即使结果具有良好的统计分布,也不能单凭这一点证明安全。 [2]

通常有多个部分协同工作:熵源提供不确定性,必要时对其输出进行处理,再由密码学确定性生成器根据保密的内部状态生成更多数值。“确定性”是指:相同的内部状态和输入会产生相同的结果,因此内部状态必须保密。应用程序通过系统接口请求这些数值。因此,并不需要为每一个返回的比特进行新的物理测量。NIST SP 800-90C 描述了如何将符合 90A 的生成器与符合 90B 的熵源结合。 [1]

在 BIP39 中,用于恢复钱包的基础在第一个单词出现之前就已生成:生成器先产生 128 到 256 比特的初始熵。比特是信息的基本单位,取值为零或一;关键在于攻击者不能预测得到的序列。随后加入校验和,也就是帮助发现部分抄写错误的一小段校验信息,再将整体转换成恢复词。用户还可以加入 passphrase,即额外的秘密文本。PBKDF2 函数根据这些输入派生出 512 比特的 seed,作为派生钱包密钥的秘密起点。更长的输出和校验和都不能补上缺失的随机性。因此,不要自行挑选恢复词。 [6]

设备必须能检测故障,例如噪声源开始不断重复同一个值。NIST SP 800-90B 因此要求在启动时和运行中检查熵源,并处理检测到的故障。不能忽略错误,却继续把输出当作已验证的随机数。这些检查针对的是熵源,并不保证整个钱包的安全。 [3]

确定性生成器会保留内部状态,以此计算后续结果。NIST SP 800-90A 描述了实例化、生成、补充新鲜熵(reseed)和终止。如果状态泄露,再调用一次生成器并不一定能恢复安全。恢复需要合适的机制,以及攻击者不知道的新熵。这也无法让攻击者忘掉先前已泄露的密钥。 [7]

你不需要自己编写 RNG。应该关注具体钱包版本是否记录了生成方式和错误处理流程。“硬件”或“离线”这两个标签本身并不能证明这一点。审查应覆盖熵源、算法、初始化和应用接口。即使秘密生成得当,之后泄露备份仍会使其失去保护。 [1] [2]

Linux 的 getrandom() 默认等待 urandom 源完成初始化;使用 GRND_NONBLOCK 时,可能不等待而返回 EAGAIN。初始化后,不超过 256 字节的 urandom 请求保证完整读取,且不会被信号中断。更大的请求没有这一保证。因此,程序必须正确检查返回状态和实际收到的字节数。 [4]

Web Crypto 提供 getRandomValues(),用密码学强度的数值填充受支持的整数数组。超过 65536 字节会抛出 QuotaExceededError。对于受支持算法的密钥,规范推荐使用 generateKey();它不是通用的比特币钱包生成器。即使正确调用接口,也不能证明网页可信:网页代码可能能够访问生成的秘密。 [5]

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

DOC · 001NIST SP 800-90C — RBG constructions规范 DOC · 002RFC 4086 — Unpredictability and weak inputs规范 DOC · 003NIST SP 800-90B — Source health and failure handling规范 DOC · 004Linux getrandom(2) — Initialization and return behavior文档 DOC · 005W3C Web Crypto — getRandomValues and key generation规范 DOC · 006BIP39 — Initial entropy and mnemonic-to-seed derivation规范 DOC · 007NIST SP 800-90A Rev. 1 — DRBG lifecycle and reseeding规范
修订日期: 来源优先 · 非投资建议