API security

Verify webhook signatures locally

Stripe, GitHub, and Slack all HMAC-sign payloads. Test verification in your browser — signing secrets never leave the device.

Open HMAC Signer JSON & API workflow
Stripe GitHub Slack

Webhook signature checks are a common place to leak signing secrets into random “online HMAC” sites. This guide covers how each provider signs, then how to reproduce the header privately with the Webhook HMAC Signer.

Providers

How each platform signs

Stripe

Header Stripe-Signature with timestamp t and HMAC-SHA256 v1 over {timestamp}.{raw_body}.

  1. Read the raw body before JSON parse.
  2. Extract t and v1.
  3. HMAC with whsec_....
  4. Constant-time compare.
  5. Reject stale timestamps (replay window).

Stripe docs

GitHub

Header X-Hub-Signature-256 as sha256= plus hex HMAC-SHA256 of the raw body.

  1. Keep the exact delivery body.
  2. HMAC-SHA256 with the webhook secret.
  3. Compare hex digest to the header value.

GitHub docs

Slack

Header X-Slack-Signature from base string v0:{timestamp}:{raw_body}, HMAC-SHA256, prefixed v0=.

  1. Also check X-Slack-Request-Timestamp.
  2. Reject old requests (replay protection).
  3. Constant-time compare of signatures.

Slack docs

Local test

Reproduce the header in-browser

1

Open the signer

Launch the Webhook HMAC Signer.

2

Pick a preset

Stripe, GitHub, or Slack — matching that provider’s signed string.

3

Paste secret + body

Everything stays in the tab. Use a test secret, never production, if you can.

4

Generate or verify

Build the expected header, or check an incoming header against the payload.

Need audit evidence? Download a privacy receipt after the job.

Don’t paste signing secrets into a random HMAC site

Client-side Web Crypto. Stripe, GitHub, and Slack presets. Optional privacy receipt.

Open Webhook HMAC Signer