HMAC消息认证码
在线生成HMAC消息认证码,支持MD5/SHA1/SHA256/SHA512算法,所有计算在浏览器本地完成
关于 HMAC
- HMAC(基于哈希的消息认证码)结合密钥和哈希函数,同时验证数据完整性和来源真实性
- 与普通哈希不同,HMAC 需要密钥,没有密钥无法伪造,常用于 API 签名、JWT 签名、Webhook 验签
- HMAC-SHA256 是目前最常用的方案,兼顾安全性和性能
操作说明
- 选择哈希算法,输入消息内容和密钥,点击「生成HMAC」
- 密钥支持 UTF-8 文本或十六进制字节串两种格式
- 输出支持 Hex、Base64、Base64URL 三种格式,可按需切换
- 支持 Ctrl+Enter 快捷键触发生成
注意事项
- 密钥长度建议与哈希输出长度一致(SHA256 建议 32 字节,SHA512 建议 64 字节)
- 密钥选择「十六进制」时,只能包含
0-9和a-f字符(如deadbeef),奇数位时会自动补0 - 所有计算均在浏览器本地完成,消息和密钥不会上传至服务器
HMAC 知识详解
HMAC 工作原理
HMAC 的计算公式:
HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
H:哈希函数(MD5/SHA1/SHA256/SHA512)K:密钥,K'为填充到块大小的密钥ipad:内部填充(0x36 重复),opad:外部填充(0x5C 重复)- 两次哈希运算确保即使哈希函数存在长度扩展攻击,HMAC 仍然安全
各算法输出长度对比
| 算法 | 输出位数 | Hex 长度 | Base64 长度 | 安全性 |
|---|---|---|---|---|
| HMAC-MD5 | 128 bit | 32 字符 | 24 字符 | ⚠️ 已不推荐 |
| HMAC-SHA1 | 160 bit | 40 字符 | 28 字符 | ⚠️ 逐渐淘汰 |
| HMAC-SHA256 | 256 bit | 64 字符 | 44 字符 | ✅ 推荐 |
| HMAC-SHA512 | 512 bit | 128 字符 | 88 字符 | ✅ 高安全 |
常见应用场景
| 场景 | 常用算法 | 说明 |
|---|---|---|
| JWT 签名 | HMAC-SHA256 | HS256 算法,签名 Header.Payload |
| API 请求签名 | HMAC-SHA256 | AWS SigV4、微信支付签名等 |
| Webhook 验签 | HMAC-SHA256 | GitHub、Stripe 等平台的 Webhook 安全验证 |
| Cookie 防篡改 | HMAC-SHA256 | 对 Cookie 值签名,防止客户端篡改 |
| 文件完整性 | HMAC-SHA512 | 验证文件传输过程中未被篡改 |
输出格式差异
| 格式 | 字符集 | 长度(SHA256) | 典型用途 | 示例 |
|---|---|---|---|---|
| Hex | 0-9 a-f |
64 字符 | 调试、日志、数据库存储 | b94d27b9... |
| Base64 | A-Z a-z 0-9 + / = |
44 字符 | HTTP Header、邮件传输 | uU0nuZNNPgilLlLX... |
| Base64URL | A-Z a-z 0-9 - _(无 =) |
43 字符 | JWT、URL 参数、Cookie | uU0nuZNNPgilLlLX... |
- Hex 可读性最好,但长度是 Base64 的约 1.5 倍
- Base64 比 Hex 紧凑,但含
+/=字符,放入 URL 时需要额外编码 - Base64URL 是 Base64 的 URL 安全变体,将
+替换为-,/替换为_,去掉末尾=,可直接用于 URL 和 JWT
代码示例
JavaScript(Node.js)
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'secret');
hmac.update('Hello World');
console.log(hmac.digest('hex'));
const hmac = crypto.createHmac('sha256', 'secret');
hmac.update('Hello World');
console.log(hmac.digest('hex'));
Python
import hmac, hashlib
h = hmac.new(b'secret', b'Hello World', hashlib.sha256)
print(h.hexdigest())
h = hmac.new(b'secret', b'Hello World', hashlib.sha256)
print(h.hexdigest())