- 定义
HMAC(Hash-based Message Authentication Code)是一种基于哈希函数和密钥的消息认证机制,用于验证数据的完整性和来源身份。广泛应用于 API 请求签名、数据传输校验、身份认证等场景,是现代安全通信的核心技术之一 - 核心概念
输入:消息内容 + 密钥
处理:通过哈希函数(如 SHA-256)进行两轮加密计算
输出:一个固定长度的签名值(哈希值)
只有拥有密钥的一方才能生成或验证这个签名,从而确保数据没有被篡改,也确实来自可信方。
通常情况下,这些 X-Ca- 开头的请求头(包括 HMAC 签名)是由浏览器端 JavaScript 动态生成的,而不是后端直接传过来的。
在某些平台(比如阿里云、AWS)中,签名是由后端生成并返回给前端使用。 - 计算公式
HMAC(K, M) = H((K ⊕ opad) || H((K ⊕ ipad) || M))
K:密钥
M:消息
H:哈希函数(如 SHA-256)
⊕:异或操作
opad / ipad:外部 / 内部填充常量
这两轮哈希计算增强了安全性,防止长度扩展攻击等常见漏洞。 - 应用场景
API 请求签名 防止请求被篡改或伪造
数据完整性校验 确保文件或消息未被修改
身份认证 验证请求是否来自合法用户
防重放攻击 结合时间戳和随机数,防止旧请求被重复利用 - 举个例子
import crypto from 'crypto';function generateHMAC(message, secret) {return crypto.createHmac('sha256', secret).update(message).digest('base64');
}const signature = generateHMAC('GET /api/data?page=1', 'your_secret_key');
console.log('HMAC-SHA256 签名:', signature);