什么是 HMAC?
HMAC(基于哈希的消息认证码)是一种加密技术,将密钥与哈希函数结合以验证消息的完整性和真实性。它确保数据未被篡改并来自可信来源。
快速了解
| 全称 | 基于哈希的消息认证码 |
|---|---|
| 创建时间 | 1996 年(RFC 2104) |
| 规范文档 | 官方规范 |
HMAC 工作原理
HMAC 于 1996 年发布,在 RFC 2104 中定义。它通过以特定方式使用密钥对消息进行两次哈希来工作,使其能够抵抗影响普通哈希函数的长度扩展攻击。HMAC 可以使用任何加密哈希函数,如 SHA-256 或 SHA-512。生成的代码是固定大小的值,如果消息或密钥被修改,它会完全改变。HMAC 广泛用于 API 认证、JWT 签名和安全通信协议。
主要特点
- 将密钥与哈希函数结合
- 同时提供完整性和真实性
- 抵抗长度扩展攻击
- 可以使用任何哈希函数(SHA-256、SHA-512)
- 无论输入如何,输出大小固定
- 需要双方共享密钥
常见用途
- API 请求签名
- JWT 签名验证
- Webhook 负载验证
- 安全 cookie 签名
- 协议中的消息认证
示例
HMAC 计算:
消息: "Hello, World!"
密钥: "my-secret-key"
算法: HMAC-SHA256
结果: 5f8c9f4e3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d
JavaScript (Node.js):
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'my-secret-key');
hmac.update('Hello, World!');
const signature = hmac.digest('hex');
Python:
import hmac
import hashlib
signature = hmac.new(
b'my-secret-key',
b'Hello, World!',
hashlib.sha256
).hexdigest()
API 签名示例:
时间戳: 1704067200
方法: POST
路径: /api/orders
正文: {"item": "widget"}
待签名字符串: "1704067200.POST./api/orders.{\"item\":\"widget\"}"
HMAC-SHA256 签名: <计算的签名>