跳到主要内容
ecdsa.com

HMAC

RFC 2104 和 FIPS 198-1 定义的带密钥哈希消息认证码,计算方式为 H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)),可向共享该密钥的任何一方证明数据的完整性和来源。
其他写法HMAC-SHA256keyed-hash message authentication codeHMAC-SHA1

HMAC 可以搭配任何哈希函数(HMAC-SHA256 生成 32 字节的标签),即使所用哈希的抗碰撞性已被攻破也仍然安全,这就是 TOTP 中仍在使用 HMAC-SHA1 的原因。长于哈希分组长度(SHA-256 为 64 字节)的密钥会先被哈希,较短的密钥则用零填充;密钥的熵位数至少应等于所需的安全级别。RFC 7518 §3.2 要求 HS256 密钥至少为 256 位。

用途:JWT 的 HS256/HS384/HS512、Webhook 签名(例如 GitHub 的 X-Hub-Signature-256 和 Stripe 的 Stripe-Signature)、AWS Signature Version 4 请求签名、HKDF 和 PBKDF2 的内部计算、TLS 1.2 记录 MAC 以及 TOTP/HOTP 验证码。比较标签时要使用常量时间函数。

HMAC 不是签名:每个验证者都持有同一个密钥,也都能生成这个标签,因此它不提供不可否认性;如果验证者不应具备签发令牌的能力,HMAC 就不适用。HMAC 计算器可以在本地计算和核对标签。

标准与参考资料

全部术语