HMAC Generator

One input per line. Output is numbered to match the input order.
Pinned tools are listed in your favourites on the home page.Copies a link to this tool that carries your current input, so it opens ready to run.Gives you an iframe snippet for putting this tool on your own site.
Ctrl+Enter Run  · Ctrl+Shift+C Copy  · Esc Clear

Understand HMAC Generator

使用共享密钥对一条消息计算 HMAC-SHA256、HMAC-SHA384 或 HMAC-SHA512 认证码。

How it works

HMAC 会把哈希跑两遍,每一遍都把密钥混入其中,因此要产生一个有效的认证码,就必须持有密钥。这正是它与普通哈希的区别:任何人都能对被改动的数据重新算出 SHA-256 摘要,这让裸摘要在面对蓄意改动时毫无用处,而 HMAC 把完整性绑定在对密钥的持有之上。输出宽度等于底层哈希——SHA-256 为 32 字节,这里显示为 64 个十六进制字符。本工具把密钥当作 UTF-8 文本处理,并使用 WebCrypto 签名。

When to use it

  • 通过对原始请求体重新计算签名,验证 GitHub 或 Stripe 的 webhook。
  • 当服务器拒绝你的签名时,调试 AWS Signature V4 或类似的请求签名方案。
  • 确认另一种语言中的签名实现产生的输出与此处逐字节一致。
  • 手工构造 HS256 JWT 的签名部分,看清各个环节是如何拼合的。
  • 由记录 id 加上服务端密钥派生出确定且不可伪造的令牌。

Watch out for

  • 在真实代码中要用常数时间比较认证码。使用 === 或普通字符串比较会在第一个不同的字节处提前退出,多次尝试之后会泄漏正确的前缀;请使用 crypto.timingSafeEqual、hmac.compare_digest 或你所用语言的等价函数。
  • 要对确切的原始字节签名。解析 JSON 再重新序列化会改变空白和键的顺序,HMAC 就对不上了。请在任何请求体解析中间件接触之前先取得请求体。
  • 编码方式必须对齐。本工具接受 UTF-8 文本密钥并返回十六进制。若某个服务方公布的是 base64 密钥,或期望 base64 签名,就需要一次显式转换——编码不匹配是签名「本该」对上却对不上的最常见原因。
  • HMAC 证明的是来源和完整性,不是新鲜度。除非把时间戳或随机数放进被签名的数据并加以校验,否则被截获的请求可以原样重放,而且会验证通过。

Not the right tool for: 那种希望第三方能够验证、却不能自行生成的签名。HMAC 是对称的——验证密钥就是签名密钥——因此当验证方不得具备伪造能力时,请使用 RS256 或 Ed25519 这类非对称算法。

Frequently Asked Questions

什么是消息认证码?

消息认证码(MAC)是附加在消息上的一小段值,用于验证消息的完整性(未被改动)和真实性(来自持有密钥的预期发送方)。HMAC 是使用最广泛的 MAC 构造——它把哈希函数与一个密钥结合起来。

API 认证是什么?

API 认证是在授予访问权限之前向服务器证明客户端身份。HMAC 被用于 API 签名方案:客户端用共享密钥对请求(方法 + 路径 + 请求体 + 时间戳)计算 HMAC,并把结果作为请求头发送。服务器重新计算并进行比对。

HMAC SHA256 是什么?

HMAC-SHA256 在 HMAC 构造内部使用 SHA-256 作为哈希函数。它产生 256 位(32 字节)的认证码。它是 webhook 签名(GitHub、Stripe)和 AWS Signature V4 最常见的选择。HMAC-SHA512 产生 512 位的认证码,安全强度更高。

How to Use HMAC Generator

  1. Paste or type your input in the input area above.
  2. The tool processes your input automatically or click Run.
  3. Copy or download the result using the action buttons.
  4. Use Ctrl+Enter to run quickly from the keyboard.