Webhook Signature Verifier

Free online tools to verify webhook signatures. Pick a provider below to check a signature against your secret with the exact scheme that provider uses — or use the generic HMAC generator. Everything runs in your browser: the payload and secret never leave the page, and there’s no signup.

What is a webhook signature?

A webhook signature is a cryptographic fingerprint a provider attaches to each webhook so you can prove the request really came from them and wasn’t altered in transit. The provider and you share a secret; the provider computes a hash — almost always HMAC‑SHA256 — over the request body (sometimes prefixed with a timestamp and id) and sends the result in a header such as Stripe-Signature, X-Hub-Signature-256 or webhook-signature. You recompute the same hash with your copy of the secret and compare. If they match, the webhook is authentic; if not, you reject it. Without this check, anyone who learns your endpoint URL could POST fake events to it.

Schemes differ in the details — which header carries the signature, whether the output is hex or base64, whether a timestamp is included to stop replay attacks, and how the secret is encoded — which is why a Stripe verifier and a Shopify verifier aren’t interchangeable. The tools above bake in each provider’s exact rules so you don’t have to.

How to verify a webhook signature

  1. Capture the raw request body before any JSON parsing — re-serializing changes the bytes and breaks the hash.
  2. Read the signature (and timestamp/id, if used) from the provider’s headers.
  3. Recompute the HMAC with your shared secret using the provider’s exact construction.
  4. Compare with a constant-time comparison (e.g. crypto.timingSafeEqual), and reject stale timestamps to block replays.

Frequently asked questions

How do I verify a webhook signature?

Recompute the provider's HMAC over the raw request body (plus any timestamp/id it signs) using your shared secret, then constant-time compare it to the signature header. Pick your provider above to do it instantly, or read the step-by-step above.

Why must I use the raw request body?

Providers sign the exact bytes they send. Parsing JSON and re-serializing it changes whitespace and key order, so the recomputed hash won't match. Always verify against the unparsed body.

What is a replay attack and how do timestamps help?

A replay attack resends a previously valid, correctly-signed webhook. Providers that sign a timestamp (Stripe, Slack, Standard Webhooks) let you reject requests older than a few minutes, which defeats replays.

Is this safe to paste secrets into?

Yes — every verifier here runs entirely in your browser with the Web Crypto API. Your payload and secret are never sent to a server, and no signup is required. Still, prefer test secrets where you can.