0Pricing
Cryptology Academy · 课时

密码学安全的 PRNG

探索 /dev/urandom、ChaCha20-CSPRNG 和 Fortuna

密码学安全的 PRNG 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。

CSPRNG 要求总结

CSPRNG 必须满足:(1) 下一比特不可预测性——即使知道此前的所有比特,也不能以大于 1/2 + 可忽略量的概率预测下一比特;(2) 状态泄露扩展抵抗性——获知当前状态不会泄露过去的输出。

/dev/urandom 与 getrandom()

Linux 的 /dev/urandom 使用从熵池播种的 CSPRNG。完成初始播种(128 位熵)后,即使熵池“为空”也可以安全使用——CSPRNG 会维护自己的内部状态。getrandom() 是现代的系统调用等价物。

基于 ChaCha20 的 CSPRNG

Linux 内核 5.17 及更高版本将其 CSPRNG 替换为基于 ChaCha20 的设计。ChaCha20 速度快(无需硬件加速),可提供 256 位安全性,并且有充分理解的安全性证明。一次性数值就是计数器;密钥来自熵池。

Fortuna

Fortuna(Ferguson 与 Schneier,2003 年)是一种 CSPRNG 设计,维护 32 个熵池并持续累积熵。生成器会在各池填满时从池中重新播种。它能够抵抗 RNG 重置和部分状态泄露攻击。

DUAL_EC_DRBG 后门

NIST SP 800-90A 最初纳入了基于椭圆曲线的 DUAL_EC_DRBG。斯诺登披露的文件揭示了 NSA 插入的后门:椭圆曲线点经过特殊选择,使 NSA 能够根据任意种子预测输出。绝不要使用 DUAL_EC_DRBG。NIST 于 2014 年将其移除。

CTR_DRBG

CTR_DRBG(NIST SP 800-90A)使用 AES 计数器模式作为 CSPRNG。种子 = 256 位密钥 + 128 位一次性数值。每次调用都会推进计数器。OpenSSL、BoringSSL 和 Windows BCrypt 中均广泛实现。在支持 AES-NI 的 CPU 上可利用硬件加速。

HASH_DRBG 与 HMAC_DRBG

HASH_DRBG 使用哈希函数(SHA-256)结合种子值进行迭代运算。HMAC_DRBG 使用 HMAC 进行混合。HMAC_DRBG 更容易正确实现,并且用于许多嵌入式系统(mbedTLS、WolfSSL)。

重新播种与熵注入

即使 CSPRNG 也必须定期重新播种。CTR_DRBG 的重新播种间隔为 2^48 次请求。Fortuna 从其熵池重新播种。手动重新播种:在启动时以及 fork() 后,将新鲜熵(由 getrandom 生成的字节)添加到 CSPRNG 状态中。

fork 问题

进程执行 fork 时,父进程和子进程会继承相同的 CSPRNG 状态,因此会产生相同的输出。修复方法:在 fork() 后立即调用 getrandom() 重新播种。较新版本的 OpenSSL 会通过 pthread_atfork() 自动处理。

实际使用 CSPRNG:Python

import secrets key = secrets.token_bytes(32) # 256 位密钥 nonce = secrets.token_bytes(12) # AES-GCM 的 96 位一次性数值 pin = secrets.randbelow(10**6) # 6 位 PIN # 绝不要将 random 模块用于密码学

浏览器密码学

window.crypto.getRandomValues(typedArray) 是浏览器的 CSPRNG。它调用 OS 的熵源。WebCrypto API 使用它生成密钥。出于安全目的,绝不要使用 Math.random()——它是从系统时间播种的非密码学 PRNG。

快速检查

应使用哪个 Python 模块来生成密码学随机字节?

回顾

ChaCha20、CTR_DRBG 和 Fortuna 等 CSPRNG 从熵种子生成不可预测的输出。避免使用 DUAL_EC_DRBG、random.random() 和 Math.random()。使用 secrets(Python)或 window.crypto(浏览器)。下一节:现实世界中的熵故障。

常见问题解答

「密码学安全的 PRNG」课时是免费的吗?

是的 — 「密码学安全的 PRNG」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。

「密码学安全的 PRNG」这节课中我会学到什么?

探索 /dev/urandom、ChaCha20-CSPRNG 和 Fortuna 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cryptology Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「密码学安全的 PRNG」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cryptology Academy 课中编写并运行代码吗?

能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 真随机性与伪随机性
  2. 密码学安全的 PRNG
  3. 熵枯竭与弱密钥漏洞
  4. 安全生成密钥、随机数和 IV
← 返回 Cryptology Academy