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

How to Use HMAC Generator

  1. 1Configure your generation settings (length, format, options)
  2. 2Click the Generate button to create new output
  3. 3Review the generated result
  4. 4Copy the output to your clipboard or download it

Frequently Asked Questions

  • Can I use the generated output in production?

    Yes, all generated values are cryptographically random (where applicable) and ready for production use. No special attribution required.

  • Is HMAC Generator free?

    Yes, 100% free. No registration, no credit card required. All tools are freely available for developers worldwide.

  • Does this tool upload my data to any server?

    No. All processing runs locally in your browser using client-side JavaScript. Your input data, code, or files never leave your device. We do not store, log, or transmit any user data.