HMAC Generator
技术详情
HMAC 生成器的工作原理
工具功能
HMAC 生成器使用密钥和哈希函数生成基于哈希的消息认证码(Hash-based Message Authentication Code)。工具接收一个消息(文本或文件)和一个密钥,通过选定的哈希算法(SHA-1、SHA-256、SHA-512、MD5 等)计算出认证码。与单纯哈希不同,HMAC 包含密钥,因此只有掌握密钥的人才能验证数据来源——即使攻击者能计算哈希值,也无法伪造有效的 HMAC。输出支持十六进制和 Base64 两种格式。
常见开发者使用场景
HMAC 算法原理 RFC 2104
HMAC 的数学定义为 HMAC(K, m) = H((K' XOR opad) || H((K' XOR ipad) || m)),其工作流程:
- 密钥处理:如果密钥长于哈希块大小,先对密钥做一次哈希缩短。如果密钥短于哈希块大小,用 0x00 填充补齐。
- 内部哈希:K' XOR 0x36(ipad 内部填充),拼接消息,计算哈希值
- 外部哈希:K' XOR 0x5C(opad 外部填充),拼接上一步的哈希结果,再做一次哈希得到最终 HMAC
- 两次嵌套:内层外层两次哈希嵌套是安全性的核心,防止长度扩展攻击
常见陷阱与注意事项
- 恒定时间比较:验证 HMAC 时必须使用恒定时间(constant-time)的比较函数,不要使用 == 或 === 运算符(时间侧信道攻击)。Node.js 使用 crypto.timingSafeEqual()。
- 密钥管理:HMAC 的密钥是共享密钥——双方使用同一密钥。密钥泄露意味着攻击者可以伪造所有消息。需使用安全的密钥分发机制。
- 哈希算法选择:不要使用 HMAC-MD5(MD5 已不安全),推荐使用 HMAC-SHA256 或更高版本。密钥长度建议至少等于哈希输出长度。
- 防重放攻击:HMAC 本身不包含时间戳,攻击者可以重放有效的 HMAC 消息。协议设计时需要加入时间戳或 Nonce 防御重放。
何时使用此工具而非代码
在测试 API 签名生成、验证 Webhook 签名、或学习 HMAC 工作原理时使用此工具。生产环境中使用 Node.js crypto.createHmac()、Python hmac 模块或 Web Crypto API(SubtleCrypto),它们经过安全审计并支持硬件密钥管理。