O que é esta ferramenta?
HMAC significa Hash-based Message Authentication Code. Ele combina uma chave secreta com uma mensagem e uma função hash padrão (como SHA-256) para produzir um resumo (digest) de tamanho fixo. Qualquer pessoa com a mesma chave e a mesma mensagem obterá exatamente o mesmo HMAC — mas sem a chave, é computacionalmente inviável produzir um HMAC válido para uma mensagem, mesmo conhecendo o algoritmo de hash utilizado.
Essa é a diferença fundamental em relação a um hash simples: um hash comum (MD5, SHA-256 etc.) recebe apenas a mensagem como entrada, então qualquer pessoa pode calculá-lo e ele não prova nada sobre quem o criou. Um HMAC recebe a mensagem *e* uma chave secreta, de modo que um HMAC válido prova que o remetente possuía o segredo — é um mecanismo de autenticação, não apenas uma verificação de integridade.
O HMAC é formalmente padronizado pelo NIST no FIPS 198-1 e definido para protocolos de internet no IETF RFC 2104. Esta ferramenta calcula HMACs usando a Web Crypto API nativa do navegador (`crypto.subtle.sign` com o algoritmo HMAC), que implementa corretamente a RFC 2104 em vez de uma versão em JavaScript feita à mão.
Por que usar?
- Chegou um webhook da Stripe com o cabeçalho X-Stripe-Signature e, antes de suspeitar dos logs do servidor, você quer reproduzir o cálculo manualmente — insere a chave secreta e o payload aqui e confere se o HMAC-SHA256 gerado bate com o valor do cabeçalho.
- Está implementando localmente a verificação de webhooks de GitHub Apps e não tem certeza se a lógica do X-Hub-Signature-256 está correta — calcula o valor esperado com uma chave e payload conhecidos e compara com a saída do seu próprio código para depurar.
- Precisa confirmar se outra equipe implementou corretamente a assinatura de requisições da sua API interna — passa a mesma chave secreta e mensagem para os dois lados e verifica na hora se chegam ao mesmo HMAC.
- Quer conferir a parte de assinatura HS256 de um JWT sem depender cegamente de uma biblioteca — cola a string do header concatenado com o payload no campo de mensagem e calcula o HMAC-SHA256 com a chave de assinatura para comparar.
- Precisa testar com uma chave secreta de produção sem enviar nada para serviços externos — todo o cálculo roda no navegador, então dá para usar segredos reais sem risco de vazamento.
- Quer entender na prática, e não só na documentação, a diferença de tamanho entre a saída de SHA-1 e SHA-256 — a ferramenta mostra os quatro algoritmos lado a lado para a mesma chave e mensagem.
Como usar
- Digite sua chave secreta no campo "Chave secreta".
- Digite a mensagem que deseja autenticar no campo "Mensagem".
- Os resultados HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 e HMAC-SHA512 são gerados instantaneamente (marque "Saída em maiúsculas" se o sistema de destino esperar letras maiúsculas).
- Clique em "Copiar" ao lado do HMAC que você precisa.
Exemplo
Entrada
Chave secreta: key
Mensagem: The quick brown fox jumps over the lazy dogResultado
HMAC-SHA256: f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
HMAC-SHA1: de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9Este é um vetor de teste padrão publicado: com a chave "key" e exatamente esta mensagem, HMAC-SHA256 e HMAC-SHA1 sempre produzem esses valores em qualquer implementação correta, então você pode verificar o resultado desta ferramenta de forma independente.
HMAC vs. hash simples: quando você precisa de uma chave
A pergunta decisiva é: você precisa provar quem criou este resumo, ou apenas que o conteúdo não mudou? Se um checksum público já basta — verificar se um arquivo baixado corresponde ao que o editor divulgou, deduplicar registros — um hash simples resolve e qualquer pessoa pode conferi-lo, sem precisar de chave. Se você precisa provar que o resumo só poderia ter sido produzido por alguém que possui um segredo específico — autenticar quem está chamando uma API, confiar no remetente de um webhook — você precisa de HMAC, porque um hash simples daria a um invasor sem nenhum segredo a mesma capacidade de forjar um resumo válido que o remetente legítimo tem.
→ Gerador de hash multialgoritmo · Decodificador de JWT · Gerador de MD5
Comparando os quatro algoritmos HMAC
Os quatro usam a mesma construção HMAC da RFC 2104, diferindo apenas na função hash subjacente e, portanto, no tamanho da saída.
| Algoritmo | Tamanho da saída | Uso típico |
|---|---|---|
| HMAC-SHA1 | 160 bits (40 caracteres hexadecimais) | APIs legadas, assinaturas antigas de OAuth 1.0a |
| HMAC-SHA256 | 256 bits (64 caracteres hexadecimais) | Assinatura de requisições de API, JWT HS256, verificação de webhooks |
| HMAC-SHA384 | 384 bits (96 caracteres hexadecimais) | Assinaturas de maior confiabilidade quando é exigida uma saída mais longa |
| HMAC-SHA512 | 512 bits (128 caracteres hexadecimais) | Resumos de comprimento máximo para aplicações de alta segurança |
Casos de uso comuns
- Assinar requisições de API de saída com um segredo compartilhado para que o servidor possa verificar a identidade de quem está chamando.
- Verificar payloads de webhooks recebidos (os cabeçalhos Stripe-Signature, X-Hub-Signature-256 do GitHub e semelhantes usam todos HMAC-SHA256).
- Gerar e validar a parte de assinatura de um JWT assinado com HS256/HS384/HS512.
- Testar se sua implementação de HMAC no servidor ou no cliente corresponde à saída esperada antes de colocá-la em produção.
Cuidados ao verificar assinaturas de webhook
Muitos serviços não assinam simplesmente o corpo bruto da requisição — eles concatenam o corpo com outros elementos, como um timestamp, antes de calcular o HMAC. A Stripe, por exemplo, junta o timestamp e o payload num formato específico antes de assinar, então, ao reproduzir a verificação nesta ferramenta, é essencial consultar a documentação do serviço para saber exatamente qual string está sendo assinada.
Além disso, se o corpo da requisição for um JSON, fazer o parse e depois serializar de novo costuma mudar quebras de linha e a ordem das chaves, o que altera a sequência de bytes original. Ao verificar uma assinatura, sempre cole no campo de mensagem o corpo bruto exatamente como foi recebido — usar uma versão já reformatada faz até uma implementação correta apresentar um resultado que não bate.
Perguntas frequentes
O que é HMAC?
HMAC (Hash-based Message Authentication Code) combina uma chave secreta com uma mensagem usando uma função hash para produzir um resumo que comprova tanto a integridade da mensagem quanto a posse da chave pelo remetente. Está definido no FIPS 198-1 do NIST e na RFC 2104 do IETF.
Qual é a diferença entre HMAC e um hash simples?
Um hash simples (SHA-256, MD5 etc.) recebe apenas uma mensagem como entrada — qualquer pessoa pode calculá-lo, então ele só prova que a mensagem não foi corrompida, não quem a enviou. Um HMAC recebe uma mensagem mais uma chave secreta: se você precisa provar que uma mensagem veio de alguém que possui um segredo específico (uma assinatura de API, o remetente de um webhook), precisa de HMAC. Se você só precisa checar se um arquivo ou mensagem não mudou, sem se importar em provar a autoria, um hash simples já basta.
Minha chave secreta é enviada a um servidor?
Não. Esta ferramenta calcula o HMAC inteiramente no seu navegador usando a Web Crypto API. Sua chave e sua mensagem nunca são transmitidas para lugar nenhum — você pode testar segredos reais de produção com segurança.
Qual algoritmo devo usar — SHA-1, SHA-256, SHA-384 ou SHA-512?
Use HMAC-SHA256, a menos que um sistema específico exija outra coisa — é o padrão de fato para assinatura de APIs (usado por AWS, Stripe, webhooks do GitHub e pela maioria das APIs modernas) e oferece uma boa margem de segurança. HMAC-SHA1 ainda é comum em sistemas legados (como implementações antigas de OAuth 1.0a), mas o hash subjacente do SHA-1 é considerado mais fraco; HMAC-SHA384/512 são usados quando uma saída mais longa ou margem de segurança extra é especificamente exigida.
O HMAC-SHA1 é inseguro, já que o SHA-1 puro está quebrado?
Os ataques de colisão de 2017 quebraram o SHA-1 como função hash simples, mas o HMAC-SHA1 ainda é considerado criptograficamente sólido, pois a segurança do HMAC não depende da resistência a colisões da mesma forma. Ainda assim, para sistemas novos é preferível usar HMAC-SHA256 ou superior — não há desvantagem prática nisso e a questão nem chega a se colocar.
Quais são os usos comuns do HMAC no mundo real?
Assinar requisições de API REST para que um servidor possa verificar que quem está chamando possui o segredo de API compartilhado; verificar payloads de webhooks de serviços como Stripe, GitHub e Shopify para confirmar que uma requisição realmente veio deles e não foi forjada; gerar senhas de uso único baseadas em tempo (TOTP/HOTP) para autenticação de dois fatores; e assinar tokens JWT com os algoritmos HS256/HS384/HS512.
O HMAC gerado por esta ferramenta sempre vai bater com o do meu código, usando a mesma chave e mensagem?
Sim. O HMAC é um algoritmo rigorosamente definido pela RFC 2104, então usando a mesma função hash (por exemplo, SHA-256), a mesma chave e a mesma mensagem, qualquer implementação correta — em qualquer linguagem ou biblioteca — vai produzir exatamente a mesma saída. Se os valores não baterem, o mais provável é uma diferença na codificação da chave ou da mensagem (UTF-8 ou não, quebras de linha extras, etc.).
Que tipo de string devo usar como chave? Existe limite de tamanho?
Não há um limite máximo de tamanho para a chave de um HMAC — pode ser desde uma string curta até uma sequência aleatória longa. Chaves muito curtas, porém, enfraquecem a segurança; em produção, a recomendação usual para HMAC-SHA256 é uma chave aleatória de cerca de 32 bytes (256 bits). Como esta ferramenta é para testes e verificação, você pode inserir qualquer string como chave.
Para que serve a opção "Saída em maiúsculas"?
Por padrão, o HMAC é exibido em hexadecimal minúsculo (0-9, a-f), mas alguns sistemas ou APIs esperam a representação em maiúsculas (0-9, A-F). Essa opção só muda o formato de exibição, sem alterar o valor em si.
O cálculo funciona corretamente com caracteres acentuados ou de outros idiomas na mensagem?
Sim. Esta ferramenta codifica a mensagem em UTF-8 antes de calcular o HMAC, então qualquer texto Unicode — incluindo acentos e caracteres de outros alfabetos — é processado sem problemas. Só vale conferir se o sistema do outro lado usa a mesma codificação, para garantir que os dois cálculos partam do mesmo ponto.