HMAC 构造与安全性证明
逐步学习 ipad/opad 构造及其安全性
HMAC 构造与安全性证明 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
欢迎
HMAC 是标准的带密钥 MAC 构造。它采用双重哈希设计,可防止长度扩展攻击,并且已有形式化安全性证明,证明过程将 HMAC 的安全性归约到底层哈希函数的安全性。
HMAC 构造
HMAC(K, M) = H((K' ⊕ opad) || H((K' ⊕ ipad) || M))
其中:
- K' = 将 K 用零填充到分组大小 B(如果 |K|>B,则使用 H(K))
- ipad = 将 0x36 重复 B 次
- opad = 将 0x5C 重复 B 次
为什么使用 ipad 和 opad
ipad(0x36)和 opad(0x5C)是不同的常量,因此 K' ⊕ ipad ≠ K' ⊕ opad。它们实际上会从 K 创建两个不同的伪随机密钥,分别用于内部哈希和外部哈希。
HMAC 步骤详解
对于 K=secret、M=message、H=SHA256:
1. K' = 将 K 填充到 64 字节
2. inner_key = K' XOR ipad
3. inner_hash = SHA256(inner_key || M)
4. outer_key = K' XOR opad
5. result = SHA256(outer_key || inner_hash)
Python 中的 HMAC
import hmac, hashlib
key = b'my_secret_key'
message = b'Hello, World!'
mac = hmac.new(key, message, hashlib.sha256)
print(mac.hexdigest())
# 64-char hex string (256 bits)
为什么 HMAC 不会遭受长度扩展攻击
已知 HMAC(K,M) = SHA256(outer_key || SHA256(inner_key || M))
攻击者知道 SHA256(inner_key || M) = inner_hash。但攻击者无法对它进行扩展——外部哈希的输入是 (outer_key || inner_hash),而不只是 inner_hash。攻击者不知道 outer_key。
HMAC 安全性证明(Bellare)
Bellare 在 1996 年证明:如果哈希函数 H 是伪随机函数(PRF),那么 HMAC 也是伪随机函数。实际意义是:对于预期的安全属性,HMAC-SHA256 的安全性与 SHA-256 相当。
HMAC 的密钥长度
HMAC 密钥必须满足以下条件:
- 至少为 L 字节(哈希输出长度)
- 建议使用正好 L 字节的随机数据
- 如果 key > block_size,则先将 key 哈希到 block_size
- 对于 HMAC-SHA256 密钥,请使用 os.urandom(32)
HMAC 截断
HMAC 输出可以截断为原输出长度的一半,而不会造成明显的安全性损失。TOTP/HOTP 会截断为 4 字节。TLS MAC 也会进行截断。绝不要截断到低于 80 位(10 字节)。
不同场景中的 HMAC
HMAC-SHA256 的应用包括:
- TOTP:身份验证代码(截断为 6 位数字)
- TLS 1.2:会话 MAC(TLS 1.3 使用 AEAD,因此不需要)
- JWT:HS256 签名(对称签名)
- API 请求签名:GitHub Webhook、AWS SigV4
HKDF:基于 HMAC 的密钥派生
HKDF(IKM, salt, info, L) 会使用两次 HMAC:
1. 提取:PRK = HMAC-SHA256(salt, IKM)
2. 扩展:OKM = HMAC-SHA256(PRK, info || counter)
HKDF 用于 TLS 1.3 密钥调度、Signal 和 WireGuard 的密钥派生。
快速检查
opad(重复使用 0x5C)的作用是什么?
回顾
您已经理解了 HMAC 的构造和安全性证明。接下来,我们将把 HMAC 应用于 API 请求签名,并学习如何防止重放攻击。
常见问题解答
「HMAC 构造与安全性证明」课时是免费的吗?
是的 — 「HMAC 构造与安全性证明」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「HMAC 构造与安全性证明」这节课中我会学到什么?
逐步学习 ipad/opad 构造及其安全性 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「HMAC 构造与安全性证明」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。