Generate an HMAC Signature

Debug a webhook or an API signature: paste the payload and the shared secret, pick the algorithm and compare the result with the signature you received. Keys can be text, hex or Base64.

  • Free
  • Runs in your browser
  • Webhook signature check
  • No sign-up
How it works

How It Works

Sign or verify in three steps.

01

Paste the message

The exact bytes that were signed, such as the raw request body.

02

Enter the secret

As text, hex or Base64, and choose HMAC-SHA256 or another algorithm.

03

Compare

Paste the received signature to see whether it matches.

About

What is an HMAC?

An HMAC (hash-based message authentication code) combines a message with a secret key and hashes the result. Anyone with the same key can recompute it, and nobody without the key can produce a valid one, so it proves a message came from someone who knows the secret and was not changed. Services such as GitHub, Stripe and Shopify sign their webhooks this way, usually with HMAC-SHA256.

Most signature failures come from the message, not the key: the signature covers the raw body exactly as sent, so re-serialised JSON with different spacing will not match.

Text, hex or Base64 keys

Use the key in the form the service gives it to you.

Four algorithms

HMAC-SHA256, SHA-512, SHA-384 and SHA-1, from your browser's Web Crypto.

Hex or Base64 output

Stripe and GitHub use hex; Shopify and many others use Base64.

Signature check

A sha256= prefix, as in GitHub's header, is ignored when comparing hex.

Features

Why Use This HMAC Generator

Debug signatures without writing code.

Verify received signatures

Paste the header value and see Match or No match.

Every key format

Text, hex and Base64 keys.

Secret stays local

The key is used in your browser and never sent anywhere.

Hex or Base64

Output in the format your service uses.

✓ No Registration✓ Free✓ Browser-based✓ Text Stays Local
FAQ

Frequently Asked Questions

Questions people ask about the HMAC Generator.

Usually the message is not byte-for-byte the same: the framework parsed and re-serialised the JSON, or whitespace changed. Sign the raw request body. Also check the key format (text versus Base64) and the algorithm.