Stripe ยท GitHub ยท Slack ยท generic HMAC โ verify a webhook payload against its signature
Webhook Signature Verifier checks whether a webhook payload actually came from the provider it claims to (Stripe, GitHub, Slack) by recomputing the HMAC signature with your signing secret and comparing it to the signature header the provider sent. Everything โ hashing, comparison, timestamp checks โ runs locally with the WebCrypto API; your secret and payload never leave the browser.
Webhook signature verification is essential because webhook endpoints are public URLs โ anyone who finds the URL can POST fake events unless you verify the sender. Each provider signs the raw request body with a shared secret using HMAC (Hash-based Message Authentication Code), so only someone who knows the secret can produce a matching signature. This tool lets you test your verification logic against real captured payloads before deploying it.
Stripe-Signature or X-Hub-Signature-256 header).Stripe-Signature verification with timestamp tolerance / replay protection.X-Hub-Signature-256 (and legacy SHA1) verification.X-Slack-Signature verification with the v0 signing scheme and timestamp check.Why does my signature never match even though I'm using the right secret?
Almost always because the payload was re-serialized (re-parsed and re-stringified JSON changes whitespace and key order, which changes the bytes being signed). Always verify against the raw request body, not a parsed-then-reserialized copy.
Why check the timestamp as well as the signature?
A valid signature only proves the payload wasn't tampered with โ it doesn't prove the request is fresh. Without a timestamp/replay check, an attacker who intercepts one valid request could resend it indefinitely.
Is it safe to paste my real webhook secret here?
This tool never makes a network request โ everything runs with the browser's built-in WebCrypto API. That said, for a production secret it's still good practice to rotate it afterward if you have any doubt about your machine's security.