Gerar e verificar assinaturas de webhook

Cole o corpo original e o segredo de assinatura para gerar ou verificar um HMAC. Os formatos GitHub e Stripe estão disponíveis; a correspondência não verifica a idade do timestamp nem impede replay.

Funciona localmente no seu navegador
Signature inputs
As quebras de linha coladas viram LF neste campo. Ative para reproduzir um corpo assinado com bytes CRLF.
Generated signature
Enter a secret and payload to generate a signature.
Verify a received signature
Gere uma assinatura ou cole uma assinatura recebida para verificá-la localmente.
Prévia do cabeçalho
Generate a signature to see the corresponding request header.
Server-side verification patterns
Generate a signature to see Node.js and PHP verification patterns.

Assine exatamente os bytes recebidos

A verificação de webhook falha quando o middleware analisa ou reformata o body antes da validação. Preserve o body original, use a entrada de assinatura documentada pelo provedor e faça uma comparação de tempo constante no servidor. Esta página não envia o payload nem o segredo.

Como gerar ou verificar uma assinatura de webhook

Assina o corpo exato que você cola com HMAC-SHA-256, SHA-384 ou SHA-512, reproduz os formatos X-Hub-Signature-256 do GitHub e v1 do Stripe e compara uma assinatura recebida byte a byte com o mesmo segredo.

O cálculo acontece nesta aba com Web Crypto. O corpo, o segredo e as assinaturas ficam no navegador; a coincidência confirma os bytes, não a idade do evento.

  1. Escolha o formato: HMAC genérico, GitHub X-Hub-Signature-256 ou Stripe v1. Os formatos dos provedores usam sempre SHA-256.
  2. Cole o corpo original exato e o segredo. No Stripe, clique em Usar hora atual ou informe o timestamp enviado; marque Assinar com quebras de linha CRLF se o emissor assinou bytes CRLF.
  3. Clique em Gerar assinatura para ver o cabeçalho correspondente e exemplos de verificação em Node.js e PHP. Alterar qualquer campo depois esmaece o valor até gerar de novo.
  4. Para conferir um valor recebido, cole em Verificar uma assinatura recebida e clique em Verificar assinatura. Hexadecimal funciona sempre, base64 funciona em webhooks genéricos e um cabeçalho Stripe-Signature completo é lido junto com o t=.
  5. Use Copiar assinatura para levar o valor do cabeçalho e Limpar para esvaziar os campos e voltar ao HMAC genérico.

O que o resultado gerado contém

Entrada assinada em cada formato

O HMAC genérico assina o corpo original. O GitHub assina o mesmo corpo e envia sha256=<hex> em X-Hub-Signature-256. O Stripe assina a string <timestamp>.<corpo> e envia t=<timestamp>,v1=<hex> em Stripe-Signature.

Ao colar um cabeçalho do Stripe, o t do cabeçalho forma a entrada assinada; o campo de timestamp só é usado quando o cabeçalho não traz t=. Segredos rotacionados podem gerar vários v1 e a verificação passa se qualquer um coincidir.

Por que um corpo igual ainda pode falhar

A área de texto transforma CR e CRLF colados em LF. Se o emissor assinou bytes CRLF, marque Assinar com quebras de linha CRLF: cada LF vira CRLF antes do cálculo.

Qualquer diferença de texto conta: JSON reserializado, quebra de linha final removida, espaço alterado, componente de URL decodificado ou leitura do corpo já interpretado geram outro resumo. Copiar só a parte hexadecimal de um cabeçalho remove o prefixo sha256= ou v1= esperado pelo formato, mas a ferramenta aceita as duas formas.

O que esta página não verifica

A verificação compara apenas os bytes do HMAC. Ela não recusa timestamps antigos nem eventos repetidos, não conhece a janela de tolerância do provedor e não contata o emissor.

Base64 é aceito em webhooks genéricos; GitHub e Stripe transmitem hexadecimal, então não há verificação base64 para eles. Rotacionar ou revogar um segredo vazado continua sendo tarefa do servidor.

Ferramentas recentes: