Random Number Generator 为特定用途提供数值。用于密码学时,必须在所述假设下使攻击者无法在实践中预测这些数值。物理熵源、确定性生成器和操作系统接口属于不同层次;RNG 这个名称本身并不说明各层的性质。
熵源提供不确定性,调理处理准备输入,确定性生成器则根据内部状态产生输出。NIST SP 800-90C 将 90A 的机制与符合 90B 的熵源组合。因此,每个返回的比特不一定对应一次新的物理测量。 [NIST SP 800-90C — RBG constructions]
一个序列可能通过统计测试,却早已为攻击者所知。RFC 4086 提醒人们注意时钟、序列号和可预测的初始值。因此,不能仅凭模拟用生成器的名称或输出分布,就认定它适合密码学。 [RFC 4086 — Unpredictability and weak inputs]
NIST SP 800-90B 评估噪声源、调理处理以及启动和运行期间的健康测试。这些测试用于发现熵源故障,并不能证明整个钱包安全。设计必须包含故障处理;不能默默把故障路径的输出当作已经验证的随机性。 [NIST SP 800-90B — Source health and failure handling]
Linux getrandom() 默认等待 urandom 源完成初始化。使用 GRND_NONBLOCK 时,它可能返回 EAGAIN 而不是等待。初始化后,从 urandom 请求不超过 256 字节时,保证完整读取且不被信号中断;更大的请求没有此保证。应用必须正确处理返回状态。 [Linux getrandom(2) — Initialization and return behavior]
Web Crypto getRandomValues() 向受支持的整数数组填入密码学强随机值;超过 65536 字节会抛出 QuotaExceededError。规范建议使用 generateKey() 创建密钥。接口存在并不证明网页可信,也不能保护秘密免受可访问它们的代码读取。 [W3C Web Crypto — getRandomValues and key generation]
BIP39 先将 128 至 256 比特的初始熵与计算得到的校验和编码,再通过 PBKDF2 从助记词及可选 passphrase 派生 512 比特 seed。校验和与更长的派生输出都无法弥补可预测输入;自行选择词语不能代替随机生成。 [BIP39 — Initial entropy and mnemonic-to-seed derivation]
确定性生成器需要保护内部状态并正确初始化。NIST SP 800-90A 区分实例化、生成、重新播种和销毁实例。状态泄露后的恢复需要合适的机制和攻击者未知的新鲜熵;再次调用生成器本身并不普遍保证恢复安全。 [NIST SP 800-90A Rev. 1 — DRBG lifecycle and reseeding]
审查应明确被评估版本的具体熵源、算法、初始化、接口及故障行为。“硬件”或“离线”标签本身不能证明这条链路。引用的标准解释生成要求,并非某个钱包的认证,也不能防止其备份后来泄露。 [NIST SP 800-90C — RBG constructions] [RFC 4086 — Unpredictability and weak inputs]
要获得更完整的理解,请将本词条与以下词条结合阅读: Cryptographic Entropy, CSPRNG, Seed Generation, Brute Force Search Space. 反向关联还来自: CSPRNG, Deterministic RNG, True Random Number Generator, Seed Generation.