Autenticação HMAC
HMAC(K, m) = H((K' XOR opad) || H((K' XOR ipad) || m)), em que K' é a chave ajustada ao tamanho de bloco da função de hash H e || é a concatenação
Calcule o HMAC de uma mensagem com uma chave secreta, em hexadecimal ou Base64, e compare-o com uma assinatura esperada (prefixo sha256= aceite) para verificar um webhook do GitHub, Stripe ou Shopify.
Hexadecimal ou Base64, com ou sem prefixo como sha256=.
Esta ferramenta calcula o HMAC de uma mensagem com uma chave secreta, com SHA-1, SHA-256, SHA-384 ou SHA-512, e compara-o com uma assinatura esperada. Destina-se sobretudo a programadores que integram ou depuram webhooks do GitHub, Stripe ou Shopify e precisam de saber se a falha vem do segredo, do corpo da mensagem ou do seu código.
Um HMAC (RFC 2104, FIPS 198-1) combina uma função de hash com uma chave secreta: HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). Esta dupla passagem torna impossível produzir o valor sem a chave e evita o ataque de extensão de comprimento que afeta um simples SHA-256(chave ‖ mensagem). Com a chave «key» e a mensagem «The quick brown fox jumps over the lazy dog», o HMAC-SHA-256 dá f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 em hexadecimal, ou seja, 97yD9DBThCSxMpjmqm+xQ+9NWaFJRhdZl0edvC0aPNg= em Base64. A chave é usada tal como é introduzida, mensagem e chave são codificadas em UTF-8 e o cálculo recorre à API Web Crypto do navegador.
A maioria dos fornecedores assina o corpo em bruto do pedido. O GitHub envia X-Hub-Signature-256: sha256=<hex>, a Shopify envia X-Shopify-Hmac-Sha256 em Base64 e a Stripe assina a cadeia «carimbo_temporal.corpo» e coloca o valor hexadecimal após v1= no cabeçalho Stripe-Signature. Escolha, portanto, a saída hexadecimal ou Base64 consoante o fornecedor e cole a assinatura recebida no campo opcional: são aceites prefixos como «sha256=» e o resultado é atualizado à medida que escreve. A comparação é feita em tempo constante, como o GitHub recomenda para o código de servidor.
Cole a mensagem exata a assinar, por exemplo o corpo em bruto de um webhook, e depois a chave secreta partilhada.
Selecione SHA-1, SHA-256, SHA-384 ou SHA-512 e uma saída hexadecimal ou Base64, consoante o que o serviço espera.
Se necessário, cole a assinatura esperada, com ou sem um prefixo como sha256=: o HMAC e o resultado da verificação são atualizados durante a escrita.
HMAC(K, m) = H((K' XOR opad) || H((K' XOR ipad) || m)), em que K' é a chave ajustada ao tamanho de bloco da função de hash H e || é a concatenação
Copie o payload em bruto e o cabeçalho X-Hub-Signature-256 a partir do separador Recent Deliveries do webhook, introduza o segredo e compare. Se o valor coincidir aqui mas não no seu servidor, é a sua framework que altera o corpo antes da verificação.
Reconstrua a cadeia assinada «t.corpo» a partir do cabeçalho Stripe-Signature e do corpo em bruto, calcule o HMAC-SHA-256 com o seu segredo whsec_… e compare-o com o valor v1 para identificar a origem de uma falha de verificação.
A Shopify assina o corpo em bruto com HMAC-SHA-256 e envia o resultado em Base64 no cabeçalho X-Shopify-Hmac-Sha256. Escolha a saída Base64 e cole o cabeçalho para confirmar que está a usar o segredo de aplicação correto.
Entrada
Mensagem: The quick brown fox jumps over the lazy dog; Chave secreta: key; Algoritmo: SHA-256; Codificação: HexadecimalResultado
Assinatura calculada: f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8Qualquer pessoa pode calcular um hash como o SHA-256: prova a integridade, não a origem. Um HMAC acrescenta uma chave secreta, pelo que só quem detém essa chave consegue produzir o valor correto. Assim, autentica o remetente além de detetar qualquer alteração.
Na maioria dos casos, o corpo foi alterado antes do cálculo: JSON analisado e novamente serializado pela framework, codificação diferente ou espaços acrescentados. Outras causas frequentes são um segredo errado (o de teste em vez do de produção), um formato de saída incorreto (hex em vez de Base64) ou, na Stripe, esquecer o carimbo temporal na cadeia assinada.
Para autenticar mensagens, sim: as colisões do SHA-1 não permitem falsificar um HMAC-SHA-1 sem a chave, e continua a ser usado, por exemplo, no TOTP. Para qualquer sistema novo, prefira no entanto o HMAC-SHA-256, hoje o padrão dos webhooks. O GitHub mantém o cabeçalho X-Hub-Signature em SHA-1 apenas por compatibilidade.
A RFC 2104 recomenda uma chave pelo menos tão longa como a saída do hash, ou seja, 32 bytes para HMAC-SHA-256. Uma chave mais longa do que o bloco (64 bytes no SHA-256) é primeiro processada pelo hash e, por isso, não acrescenta segurança. Gere-a de forma aleatória em vez de escolher uma palavra-passe.
Não, um HMAC não é uma encriptação: não contém a mensagem nem permite reconstruí-la. Aliás, a mensagem é normalmente enviada em claro junto da assinatura. Para tornar um conteúdo ilegível, é necessária uma encriptação como o AES-GCM.
O cálculo é feito apenas no seu navegador com a Web Crypto: nem a chave nem a mensagem são transmitidas. Ainda assim, por princípio, prefira um segredo de teste ou renove o segredo após uma sessão de depuração num computador partilhado.
Ferramentas relacionadas
Ferramentas semelhantes ou complementares a esta.
Calcule de uma só vez os hashes MD5, SHA-1, SHA-256, SHA-384 e SHA-512 de um texto ou ficheiro.
Verifique se dois hashes ou somas de verificação coincidem, independentemente de maiúsculas, espaços ou dois-pontos.
Gere tokens aleatórios seguros de 8 a 256 bytes em hexadecimal, Base64 ou Base64URL, com prefixo opcional.
Distinga hash, cifragem e assinatura e utilize impressões para verificar igualdade ou integridade sem lhes atribuir falsas garantias.
Saiba quando usar criptografia, hashing, HMAC ou PBKDF2 para confidencialidade, integridade, autenticação e palavras-passe.
Entenda como OAuth 2.0, PKCE, JWT, JWK e JWKS se relacionam: autorização, tokens, chaves públicas e verificação.
Saiba como o SRI utiliza uma impressão digital criptográfica para verificar se um script ou uma folha de estilos externa corresponde ao ficheiro esperado.