Paste the exact raw payload and signing secret to generate or verify an HMAC signature. GitHub and Stripe-style presets are included; a matching signature does not check timestamp freshness or prevent replay.
Runs locally in your browserEnter a secret and payload to generate a signature.
Generate a signature to see the corresponding request header.
Generate a signature to see Node.js and PHP verification patterns.
Webhook checks fail when middleware parses or reformats the body before verification. Keep the raw body, apply the provider's documented signing input, and use a timing-safe comparison in your server code. This page never sends the payload or secret anywhere.
Sign the exact payload you paste with HMAC-SHA-256, SHA-384 or SHA-512, reproduce GitHub's X-Hub-Signature-256 and Stripe's v1 header formats, and compare a received signature byte by byte with the same secret.
Hashing happens in this tab through Web Crypto. The payload, the secret and the signatures stay in the browser; a match confirms the bytes, not the freshness of the event.
Generic HMAC signs the raw request body. GitHub signs that same raw body and sends sha256=<hex digest> in X-Hub-Signature-256. Stripe signs the string <timestamp>.<raw body> and sends t=<timestamp>,v1=<hex digest> in Stripe-Signature.
When a Stripe header is pasted for verification, the t inside the header builds the signing input; the timestamp field is only read when the header carries no t=. A rotated secret can produce several v1 values, and the check passes when any of them matches.
A browser textarea turns pasted CR and CRLF into LF. If the sender signed CRLF bytes, enable Sign with CRLF line endings: every LF is rebuilt as CRLF before hashing.
Text differences matter: a re-serialized JSON body, a stripped trailing newline, a changed space, a decoded URL component, or reading the parsed body instead of the raw bytes all produce a different digest. Copying only the hex part of a provider header drops the sha256= or v1= prefix the format expects, although the tool accepts both forms.
Verification compares HMAC bytes only. It does not reject old timestamps or replayed events, does not know the provider's tolerance window, and never contacts the sender.
Base64 is accepted for generic webhooks; GitHub and Stripe transmit hex, so no base64 verification is offered for them. Rotating or revoking a leaked secret stays a server-side task.