Para que serve o HMAC
Um HMAC é um hash misturado com uma chave secreta. Qualquer pessoa calcula o SHA-256 de uma mensagem, mas só quem conhece a chave produz o HMAC-SHA256, então quem recebe sabe que a mensagem veio mesmo do remetente e não foi alterada. Provedores de pagamento e plataformas assinam webhooks assim (Stripe, GitHub, Mercado Pago, Paddle), corretoras assinam requisições de API e JWTs com HS256 são assinaturas HMAC-SHA256.
Para conferir um webhook, pegue o corpo bruto da requisição exatamente como chegou, o segredo compartilhado, e compare o HMAC calculado aqui com o cabeçalho de assinatura. Um espaço a mais ou um JSON reserializado dá um resultado totalmente diferente.
Exemplo resolvido
O caso de teste 2 da RFC 4231 assina what do ya want for nothing? com a chave Jefe. O HMAC-SHA256 dá 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843, que esta página reproduz. Mudar a chave para jefe muda a assinatura inteira.
Formatos de chave
A maioria dos serviços entrega o segredo como texto. Alguns entregam como bytes em hex ou Base64; escolha esse formato para usar os bytes, e não os caracteres, como chave.
Como funciona
A página codifica a mensagem em UTF-8, decodifica a chave no formato escolhido e calcula o HMAC definido na RFC 2104 com a API Web Crypto do navegador: a chave é completada até o tamanho do bloco do hash, combinada por XOR com uma constante interna e outra externa, e a mensagem passa pelo hash duas vezes. A assinatura aparece em hexadecimal e Base64, as duas codificações que os serviços usam nos cabeçalhos. A implementação é conferida com os vetores da RFC 4231. A chave fica nesta aba e nunca é guardada.
Perguntas frequentes
Por que a assinatura do meu webhook não bate?
Calcule sobre o corpo bruto exatamente como chegou. Ler e reserializar o JSON muda espaços e a ordem das chaves, o que muda o HMAC. Confira também o formato da chave e se um timestamp vai na frente.
HMAC-SHA1 ainda é seguro?
O HMAC-SHA1 não tem ataque prático, ao contrário do SHA-1 puro, mas sistemas novos devem usar HMAC-SHA256.
Qual deve ser o tamanho da chave?
Pelo menos o tamanho da saída do hash: 32 bytes para SHA-256, 64 para SHA-512 (RFC 2104 e RFC 7518).
Minha chave secreta é enviada?
Não. Ela é usada só no navegador e nunca é guardada.
Fontes
- RFC 2104 — HMAC: Keyed-Hashing for Message Authentication
- RFC 4231 — HMAC-SHA224/256/384/512 test vectors
- W3C — Web Cryptography API
- Wikipedia — HMAC
Revisado em 17 de out. de 2026 · vetores de teste fixtures/dev/hmac-generator/