WHAT IT DOES
Check a webhook signature without pasting your secret into someone's server.
Enter the exact payload that was signed and the shared secret, and the HMAC is computed in your browser with the Web Crypto API. Output is hex or base64, whichever your provider uses. Paste the signature you received into the expected field and the two are compared byte by byte, so a base64 signature verifies against a hex computation without you having to convert anything first. This is the check that fails when a webhook is rejected, and doing it on a page that transmits neither the payload nor the secret means you can run it against real production values.
Why use it?
Use it to reproduce a webhook signature calculation and isolate whether the disagreement is in the payload bytes, secret, hash algorithm, or signature encoding.
How to use this tool
- Paste the exact signed payload, enter the shared secret, and choose the sender's hash algorithm and output encoding.
- If comparing a received signature, paste it into the expected field and generate. Leaving that field empty means verification is not checked.
- Do not pretty-print JSON before checking it: whitespace and trailing newlines change the signed bytes. If a provider signs a timestamp plus the body, assemble that exact input first; accepting a signature header does not reconstruct the provider's signing procedure.
Details and limitations
- Signing uses the Web Crypto API's HMAC implementation, so the result matches what any correct server-side library produces for the same payload, secret, and hash.
- Verification is optional and reports one of three outcomes: verified, does not match, or not checked. An unchecked signature is never presented as a passing one.
- Common signature headers are understood directly. A GitHub sha256=... value, a Stripe v1=... element, and a bare base64 digest are all accepted, so a header can be pasted as received.
- The expected MAC is decoded to bytes before comparison, so hex and base64 forms of the same signature verify against each other.
- The comparison runs in time independent of where the first differing byte falls, which is the property a server needs even though this page has nothing remote to leak it to.