安全生成密钥、随机数和 IV
在 Python 和 Node 中使用 secrets、os.urandom 及安全封装
安全生成密钥、随机数和 IV 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
三类值
有三类不同的密码学值需要安全生成:(1) 密钥——生命周期长,必须不可预测且保密。(2) IV——每条消息使用一个,可以公开,但必须不可预测(CBC)或唯一(GCM)。(3) 一次性数值——每次使用都必须唯一,可以是随机的,也可以不是。
对称密钥
AES-128:secrets.token_bytes(16)。AES-256:secrets.token_bytes(32)。ChaCha20:secrets.token_bytes(32)。没有 KDF(PBKDF2/Argon2)时,绝不要从密码派生密钥。绝不要在不同算法或不同用途之间重复使用密钥。
非对称密钥生成
from cryptography.hazmat.primitives.asymmetric import ec, rsa rsa_key = rsa.generate_private_key(public_exponent=65537, key_size=2048) ec_key = ec.generate_private_key(ec.SECP256R1()) # 库会在内部处理熵源
AES-CBC 的 IV
AES-CBC 要求每条消息使用均匀随机的 16 字节 IV。绝不要在同一密钥下重复使用 IV。绝不要在 CBC 模式中使用计数器作为 IV。生成方式:iv = os.urandom(16)。将 IV 加在密文前面——它不需要保密,只需不可预测。
AES-GCM 的一次性数值
AES-GCM 要求每个(密钥,消息)对使用唯一的 96 位一次性数值。重复使用一次性数值会灾难性地破坏 GCM:攻击者可以恢复认证密钥并伪造消息。可以使用随机的 12 字节一次性数值(消息数达到 2^32 时受生日界限约束)或使用计数器。
基于计数器的一次性数值
对于使用单个密钥进行的大批量加密:为每个密钥维护一个持久化计数器。nonce = counter.to_bytes(12, "big")。每次加密后递增计数器。将计数器保存到持久化存储中——重启时重置会导致重复使用。
抗一次性数值误用的 AEAD
AES-GCM-SIV 和 Deoxys-II 能抵抗一次性数值误用:重复使用一次性数值只会使安全性降低到确定性加密的水平,不会泄露认证密钥。当难以保证一次性数值唯一时(例如分布式系统和崩溃重启场景),建议使用它们。
使用 HKDF 进行密钥派生
不要直接将原始密钥材料用于多个目的。请派生用途专用的密钥:from cryptography.hazmat.primitives.kdf.hkdf import HKDF。hkdf = HKDF(SHA256(), 32, salt, info=b"enc_key")。key = hkdf.derive(master_key)。为每种用途使用不同的 info。
会话密钥
使用 HKDF 从共享密钥(例如 ECDH 输出)派生特定于会话的密钥。TLS 1.3 会为握手和应用数据分别派生客户端密钥和服务器密钥。会话密钥可以隔离泄露影响:获知一个会话密钥不会泄露其他会话的任何信息。
密钥封装
要安全存储密钥,请使用 AES-KW(RFC 3394)或 AES-GCM,并通过密钥加密密钥(KEK)对其进行封装。封装后的密钥可以存储在数据库中或进行传输。KEK 存储在 HSM 或硬件支持的密钥库中(Android Keystore、Apple Secure Enclave)。
审计清单
部署前检查:(1) 所有密钥都来自 os.urandom/secrets。(2) 没有硬编码的密钥/IV。(3) IV 绝不在同一密钥下重复使用。(4) GCM 一次性数值对每条消息都唯一。(5) 已定义密钥轮换计划。(6) 密钥派生使用带有不同 info 字符串的 HKDF。
快速检查
在 AES-GCM 中重复使用一次性数值会造成什么后果?
回顾
密钥需要真正的随机性;CBC 的 IV 需要随机性;GCM 的一次性数值需要唯一性。使用 os.urandom/secrets,使用 HKDF 进行派生,并使用 KEK 进行封装。抗一次性数值误用的 AEAD 可以防止意外重复使用。下一节:零知识证明。
常见问题解答
「安全生成密钥、随机数和 IV」课时是免费的吗?
是的 — 「安全生成密钥、随机数和 IV」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「安全生成密钥、随机数和 IV」这节课中我会学到什么?
在 Python 和 Node 中使用 secrets、os.urandom 及安全封装 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「安全生成密钥、随机数和 IV」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 真随机性与伪随机性
- 密码学安全的 PRNG
- 熵枯竭与弱密钥漏洞
- 安全生成密钥、随机数和 IV