# Gerador de HMAC (SHA-256/384/512)

> Calcule um HMAC com chave sobre uma mensagem usando sua chave secreta, mostrado em hex e Base64, via o Web Crypto nativo do navegador. A mesma construção que o verificador de JWT usa para HS256. Sua chave nunca sai do seu navegador.

- Tool: https://ronutz.com/pt-BR/tools/hmac
- Family: Hashing e cripto

---

## O que faz

Calcule um HMAC, um hash com chave, sobre uma mensagem usando uma chave secreta, com o resultado mostrado em hexadecimal e Base64. Você escolhe SHA-256, SHA-384 ou SHA-512 como o hash subjacente. O cálculo usa o Web Crypto nativo do navegador, e sua chave nunca sai do seu navegador. Esta é a mesma construção, pelo mesmo caminho de código, que o verificador de JWT usa para checar uma assinatura HS256, então os dois concordam por design.

## Para que serve o HMAC

Um hash simples prova que os dados não mudaram, mas qualquer um pode recalculá-lo, então não prova quem os produziu. O HMAC adiciona uma chave secreta ao hash, o que o transforma em um código de autenticação de mensagem: um valor que prova tanto que a mensagem está íntegra quanto que ela veio de alguém que possui a chave. O remetente calcula o HMAC e o envia junto com a mensagem; o destinatário, que compartilha a chave, o recalcula e verifica se os dois batem. É definido na RFC 2104 e na FIPS 198-1, com vetores de teste na RFC 4231.

## Simétrico por natureza

O HMAC usa um único segredo compartilhado tanto para produzir quanto para verificar o código. Isso o torna rápido e simples, mas também significa que quem consegue verificar um HMAC também consegue forjar um, porque ambas as operações usam a mesma chave. É a ferramenta certa quando a mesma parte, ou duas partes que já compartilham um segredo confiável, produzem e conferem os códigos. Quando partes independentes precisam verificar sem poder forjar, uma assinatura assimétrica encaixa melhor, que é o mesmo compromisso que separa HS256 de RS256 em JWTs.

## Como é construído

O HMAC não é simplesmente o hash da chave juntada à mensagem, o que seria vulnerável a ataques de extensão de comprimento. É uma construção aninhada: a mensagem é resumida junto com uma forma derivada da chave, e esse resultado é resumido de novo com uma segunda forma derivada. Essa estrutura é o que dá ao HMAC sua prova de segurança, e é por isso que você deve usar HMAC em vez de inventar seu próprio hash com chave.

## Como usar

Informe uma mensagem e uma chave secreta, escolha o hash e leia o HMAC em hex ou Base64. Forneça a mesma mensagem e chave a dois sistemas e os códigos vão bater; mude a mensagem ou a chave por um caractere e o código muda completamente.

## Standards and references

- [RFC 2104 - HMAC: Keyed-Hashing for Message Authentication](https://www.rfc-editor.org/rfc/rfc2104) - the HMAC construction
- [RFC 4231 - HMAC-SHA Identifiers and Test Vectors](https://www.rfc-editor.org/rfc/rfc4231) - HMAC-SHA-256/384/512 test vectors
- [FIPS 198-1 - The Keyed-Hash Message Authentication Code (HMAC)](https://csrc.nist.gov/pubs/fips/198-1/final) - NIST standard for HMAC

## Related reading

- [Autenticando requisições de API com HMAC](https://ronutz.com/pt-BR/learn/hmac-api-signing.md): Como um segredo compartilhado e um hash permitem que um servidor confie em uma requisição que não viu ser feita, e como a proteção contra repetição se encaixa.
- [Hash, criptografia e codificação: três coisas diferentes](https://ronutz.com/pt-BR/learn/hashing-encryption-encoding.md): Três operações constantemente confundidas, separadas de forma limpa por duas perguntas: é reversível e precisa de uma chave?
- [HMAC: hash com chave para autenticação de mensagens](https://ronutz.com/pt-BR/learn/hmac.md): Por que um hash simples prova integridade mas não autenticidade, como uma chave secreta resolve isso e por que a estrutura do HMAC importa.
- [Por que HMAC, e não hash(chave + mensagem)](https://ronutz.com/pt-BR/learn/why-hmac.md): O ataque de extensão de comprimento que quebra o hashing com chave ingênuo, e a construção aninhada que o HMAC usa para derrotá-lo.
- [Verificando um HMAC com segurança: tempo constante e repetição](https://ronutz.com/pt-BR/learn/verifying-hmac.md): Por que comparar assinaturas com == vaza um canal lateral de tempo, e por que uma assinatura válida sozinha não impede uma requisição repetida.
