什么是 HMAC?

HMAC(基于哈希的消息认证码)是一种加密技术,将密钥与哈希函数结合以验证消息的完整性和真实性。它确保数据未被篡改并来自可信来源。

快速了解

全称基于哈希的消息认证码
创建时间1996 年(RFC 2104)
规范文档官方规范

工作原理

HMAC 于 1996 年发布,在 RFC 2104 中定义。它通过以特定方式使用密钥对消息进行两次哈希来工作,使其能够抵抗影响普通哈希函数的长度扩展攻击。HMAC 可以使用任何加密哈希函数,如 SHA-256 或 SHA-512。生成的代码是固定大小的值,如果消息或密钥被修改,它会完全改变。HMAC 广泛用于 API 认证、JWT 签名和安全通信协议。

主要特点

  • 将密钥与哈希函数结合
  • 同时提供完整性和真实性
  • 抵抗长度扩展攻击
  • 可以使用任何哈希函数(SHA-256、SHA-512)
  • 无论输入如何,输出大小固定
  • 需要双方共享密钥

常见用途

  1. API 请求签名
  2. JWT 签名验证
  3. Webhook 负载验证
  4. 安全 cookie 签名
  5. 协议中的消息认证

示例

loading...
Loading code...

常见问题

HMAC 和普通哈希有什么区别?

普通哈希只提供数据完整性(检测数据是否被修改),而 HMAC 同时提供完整性和真实性(验证数据来自拥有密钥的可信来源)。HMAC 使用与哈希函数混合的密钥,因此只有拥有密钥的各方才能生成或验证 HMAC 值。

为什么 HMAC 比简单地用密钥哈希消息更安全?

简单地在哈希前将密钥与消息连接(例如 hash(key + message))容易受到长度扩展攻击,攻击者可以在不知道密钥的情况下向消息追加数据。HMAC 的双重哈希构造配合内外填充专门防止了这种攻击,并提供经过验证的安全保障。

应该使用哪种哈希算法配合 HMAC?

HMAC-SHA256 是最广泛推荐的选择,在安全性和性能之间取得良好平衡。HMAC-SHA512 为高度敏感的应用提供额外的安全裕度。新实现应避免使用 HMAC-MD5 和 HMAC-SHA1,尽管在 HMAC 构造中使用时它们比底层哈希函数更安全。

HMAC 在 API 认证中是如何使用的?

在 API 认证中,客户端通过使用共享密钥对请求详情(方法、路径、时间戳、正文)进行哈希来创建 HMAC 签名。服务器使用其密钥副本重新创建相同的 HMAC,并与收到的签名进行比较。如果匹配,则请求已认证且未被篡改。

如果 HMAC 密钥泄露会怎样?

如果密钥泄露,攻击者可以为任何消息伪造有效的 HMAC 签名,完全绕过认证。您应该立即轮换(更改)泄露的密钥,并使所有使用旧密钥创建的令牌或签名失效。使用适当的密钥管理实践(如安全存储和定期轮换)来最小化此风险。

相关工具

相关术语

相关文章