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 navegadorEnter 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.
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.
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.
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.
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.
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.