JoyToolsJoyTools

GitHub Webhook Signature Tester (`X-Hub-Signature-256: sha256=...`)

100% Client-Side Private — Zero Server Uploads

Compute and verify GitHub X-Hub-Signature-256 (sha256=<hex>) HMAC-SHA256 webhook headers for push and pull_request events.

🔒 100% Client-Side: Dữ liệu được xử lý trực tiếp trên trình duyệt và không bao giờ rời khỏi thiết bị của bạn (Zero Server Uploads).
E-E-A-T Security Proof →
Interactive Workspace
Platform:
Algorithm:
Format:
X-Hub-Signature-256 (SHA-256 / HEX)
Enter secret key to compute signature...

Verify Received X-Hub-Signature-256 Header

Share & Developer Embed

How do I use GitHub Webhook Signature Tester (`X-Hub-Signature-256: sha256=...`)?

1

Notice the tool is pre-configured to 'GitHub (sha256=)' mode with `SHA-256`, `HEX` encoding, and a sample GitHub `push` event payload.

2

Enter your repository or GitHub App Webhook Secret.

3

Paste the raw JSON webhook payload to generate the exact `sha256=<hex_digest>` value for the `X-Hub-Signature-256` header.

4

Copy the header for cURL/Postman testing or paste a received `X-Hub-Signature-256` header into the bottom box to verify it.

What features does GitHub Webhook Signature Tester (`X-Hub-Signature-256: sha256=...`) offer?

Pre-configured for GitHub's `X-Hub-Signature-256` (`sha256=` prefix + lowercase hex HMAC-SHA256)

Also supports legacy `X-Hub-Signature` (`SHA-1`) when toggling the algorithm button

Pre-loaded with an authentic GitHub `push` event JSON payload (`refs/heads/main` on `octocat/Hello-World`)

Verifier box matches both `sha256=<hex>` header strings and raw 64-character hex digests

Ideal for building CI/CD runners, Probot apps, and GitOps deployment webhooks

100% Client-Side Web Crypto API: GitHub App webhook secrets never leave your browser

GitHub `X-Hub-Signature-256` Specification & Constant-Time Verification

GitHub signs the raw HTTP request body with HMAC-SHA256 and prepends the literal string `sha256=` to the 64-character lowercase hex digest.

GitHub X-Hub-Signature-256 Header Formula
X-Hub-Signature-256 = "sha256=" + HMAC_SHA256_HEX(webhook_secret, raw_payload)

Always compare the full `sha256=...` string using `crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))`.

GitHub Webhook Security Headers Reference
GitHub HeaderFormatStatusSecurity Recommendation
X-Hub-Signature-256sha256=<64-char-hex>Recommended StandardAlways validate using HMAC-SHA256
X-Hub-Signaturesha1=<40-char-hex>Legacy (Deprecated)Only use for legacy integrations
X-GitHub-Eventpush / pull_request / issuesActiveFilter expected event types early
X-GitHub-Delivery72d3162e-cc78-11e3-81ab...Active (UUID)Log delivery GUID for replay debugging

How is GitHub Webhook Signature Tester (`X-Hub-Signature-256: sha256=...`) used in real-world workflows?

DevOps & CI/CD Platform Engineers

Testing Custom Self-Hosted Runner & Deployment Webhooks

Generate valid `X-Hub-Signature-256: sha256=...` headers to trigger local CI/CD webhook listeners without pushing dummy commits to GitHub.

GitHub App & Probot Maintainers

Debugging Webhook Secret Mismatches on `pull_request` Events

Copy the raw payload from `GitHub Settings > Webhooks > Recent Deliveries` and verify it against your local `.env` `WEBHOOK_SECRET`.

Application Security Engineers

Validating Webhook Authentication Controls in Penetration Tests

Craft signed and tampered payloads to confirm that webhook endpoints reject modified bodies or missing `sha256=` prefixes.

Frequently Asked Questions about GitHub Webhook Signature Tester (`X-Hub-Signature-256: sha256=...`)

What is the difference between `X-Hub-Signature-256` and `X-Hub-Signature`?

`X-Hub-Signature-256` uses HMAC-SHA256 (`sha256=<64-char-hex>`) and is GitHub's recommended security standard. `X-Hub-Signature` uses legacy HMAC-SHA1 (`sha1=<40-char-hex>`) and is retained only for backward compatibility.

Why does GitHub recommend `crypto.timingSafeEqual` instead of `===`?

Standard string equality (`===`) returns `false` on the first mismatched byte, which leaks timing information (a side-channel timing attack). `crypto.timingSafeEqual` compares all bytes in constant time.

What happens if my GitHub webhook payload is sent as `application/x-www-form-urlencoded`?

If your GitHub webhook Content type is set to `application/x-www-form-urlencoded` instead of `application/json`, GitHub signs the URL-encoded string `payload=%7B...%7D`. We recommend setting Content type to `application/json` in your GitHub webhook settings.

Are my GitHub webhook secrets transmitted anywhere?

No. Everything executes 100% locally in your browser using the Web Crypto API.