CodeKitHub
Ferramentas de codificação

Gerador de HMAC

Última atualização:

Esta ferramenta calcula um HMAC (Hash-based Message Authentication Code) a partir de uma chave secreta e uma mensagem, usando SHA-1, SHA-256, SHA-384 ou SHA-512 como função hash subjacente. Ao contrário de um hash simples, um HMAC exige uma chave secreta compartilhada, provando assim que a mensagem veio de quem possui essa chave e que não foi alterada durante o envio — por isso as APIs usam HMACs para assinar requisições e os webhooks os usam para verificar o remetente de um payload. Tudo roda localmente por meio da Web Crypto API embutida no navegador; sua chave secreta e sua mensagem nunca são enviadas a nenhum servidor.

HMAC-SHA1
HMAC-SHA256
HMAC-SHA384
HMAC-SHA512

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

  1. Digite sua chave secreta no campo "Chave secreta".
  2. Digite a mensagem que deseja autenticar no campo "Mensagem".
  3. 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).
  4. Clique em "Copiar" ao lado do HMAC que você precisa.

Exemplo

Entrada

Chave secreta: key
Mensagem: The quick brown fox jumps over the lazy dog

Resultado

HMAC-SHA256: f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
HMAC-SHA1: de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9

Este é 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.

AlgoritmoTamanho da saídaUso típico
HMAC-SHA1160 bits (40 caracteres hexadecimais)APIs legadas, assinaturas antigas de OAuth 1.0a
HMAC-SHA256256 bits (64 caracteres hexadecimais)Assinatura de requisições de API, JWT HS256, verificação de webhooks
HMAC-SHA384384 bits (96 caracteres hexadecimais)Assinaturas de maior confiabilidade quando é exigida uma saída mais longa
HMAC-SHA512512 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.

Ferramentas relacionadas