什么是 HMAC?
HMAC(基于哈希的消息认证码)是一种加密技术,将密钥与哈希函数结合以验证消息的完整性和真实性。它确保数据未被篡改并来自可信来源。
快速了解
| 全称 | 基于哈希的消息认证码 |
|---|---|
| 创建时间 | 1996 年(RFC 2104) |
| 规范文档 | 官方规范 |
工作原理
HMAC 于 1996 年发布,在 RFC 2104 中定义。它通过以特定方式使用密钥对消息进行两次哈希来工作,使其能够抵抗影响普通哈希函数的长度扩展攻击。HMAC 可以使用任何加密哈希函数,如 SHA-256 或 SHA-512。生成的代码是固定大小的值,如果消息或密钥被修改,它会完全改变。HMAC 广泛用于 API 认证、JWT 签名和安全通信协议。
主要特点
- 将密钥与哈希函数结合
- 同时提供完整性和真实性
- 抵抗长度扩展攻击
- 可以使用任何哈希函数(SHA-256、SHA-512)
- 无论输入如何,输出大小固定
- 需要双方共享密钥
常见用途
- API 请求签名
- JWT 签名验证
- Webhook 负载验证
- 安全 cookie 签名
- 协议中的消息认证
示例
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 签名,完全绕过认证。您应该立即轮换(更改)泄露的密钥,并使所有使用旧密钥创建的令牌或签名失效。使用适当的密钥管理实践(如安全存储和定期轮换)来最小化此风险。