CodeToolProCodeToolProFree Online Developer Tools
GitHub

HMAC Generator

技术详情

HMAC 生成器的工作原理

工具功能

HMAC 生成器使用密钥和哈希函数生成基于哈希的消息认证码(Hash-based Message Authentication Code)。工具接收一个消息(文本或文件)和一个密钥,通过选定的哈希算法(SHA-1、SHA-256、SHA-512、MD5 等)计算出认证码。与单纯哈希不同,HMAC 包含密钥,因此只有掌握密钥的人才能验证数据来源——即使攻击者能计算哈希值,也无法伪造有效的 HMAC。输出支持十六进制和 Base64 两种格式。


常见开发者使用场景

HMAC 在 API 安全和数据完整性验证中广泛使用。JWT Token 签名的 HS256 算法就是 HMAC-SHA256 的别名。Webhook 验证中,发送方用共享密钥对 Payload 计算 HMAC 并放入 X-Signature 头——接收方可以用相同密钥验证签名。云服务 SDK(如 AWS SDK、阿里云 SDK)的请求签名流程核心依赖于 HMAC。OAuth 1.0 的签名过程使用 HMAC-SHA1。CDN 的 URL 签名鉴权也常使用 HMAC 技术。

配合 哈希计算器 对比普通哈希和带密钥哈希的输出差异,或使用 JWT 解码器 验证 HMAC 签名的 Token。


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),它们经过安全审计并支持硬件密钥管理。