Gerador de HMAC e Verificador de Assinatura
Gerador e verificador de HMAC online e gratuito. Calcule HMAC-SHA256/SHA1/SHA384/SHA512 com chaves em Texto, Hex ou Base64 e saída Hex/Base64/Base64URL. 100% no seu navegador — as chaves nunca saem da página.
O Que É um HMAC?
Um HMAC (Hash-based Message Authentication Code) é uma tag curta e de tamanho fixo que prova que uma mensagem está ao mesmo tempo inalterada e autêntica — que foi produzida por alguém que possui uma chave secreta compartilhada. Definido na RFC 2104 e na FIPS 198-1, o HMAC combina qualquer função de hash criptográfica com uma chave secreta numa construção aninhada específica, escrita como HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). O hash interno vincula a chave à mensagem; o hash externo envolve o resultado, e é isso que torna o HMAC resistente aos ataques de extensão de comprimento que afetam as funções SHA-1 e SHA-256 puras.
O HMAC está em toda parte na infraestrutura web moderna. Ele assina webhooks para que você possa confirmar que uma requisição recebida realmente veio do GitHub, Stripe, Slack ou Twilio e não foi forjada. Ele assina requisições de API (o AWS Signature Version 4 é construído sobre HMAC-SHA256) para que um servidor possa autenticar quem chama sem enviar uma senha pela rede. É o S do HS256: um JWT assinado com HS256 carrega um HMAC-SHA256 sobre seu cabeçalho e payload, que você pode inspecionar com o codificador JWT. Ele também sustenta a derivação de chaves do TLS (HKDF), os algoritmos de senha de uso único (HOTP/TOTP) e a integridade de mensagens em incontáveis serviços internos.
Esta ferramenta calcula o HMAC inteiramente no seu navegador usando crypto.subtle.sign('HMAC', ...) da Web Crypto API — a mesma primitiva que os navegadores usam durante os handshakes do TLS. Sua chave secreta e mensagem nunca são enviadas, então é seguro para segredos de assinatura de produção. Como o mesmo segredo pode ser expresso como texto bruto, hex ou base64, a ferramenta deixa você escolher a Codificação da chave explicitamente e, como diferentes provedores esperam a tag em formas diferentes, você pode produzir Hex, Base64 ou Base64URL. A aba Verificar permite checar uma assinatura que você recebeu, usando uma comparação de tempo constante para que a própria checagem não vaze informação de tempo.
const crypto = require('crypto');
// HMAC-SHA256 with a UTF-8 text key, hex output
const hmac = crypto
.createHmac('sha256', 'my-secret-key')
.update('Hello, World!')
.digest('hex');
console.log(hmac);
// → 'cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699'
// Verify a signature in constant time
function verify(message, key, expectedHex) {
const actual = crypto.createHmac('sha256', key).update(message).digest();
const expected = Buffer.from(expectedHex, 'hex');
return actual.length === expected.length &&
crypto.timingSafeEqual(actual, expected);
} Principais Recursos
Gere e verifique em uma só ferramenta
Gere uma assinatura na aba Gerar, ou cole um HMAC esperado na aba Verificar para autenticar um webhook ou token recebido. A verificação usa uma comparação de tempo constante para que o resultado nunca vaze informação de tempo.
Escolha a codificação da chave
Interprete seu segredo como Texto (UTF-8), Hexadecimal ou Base64. Esta é a configuração que a maioria das outras ferramentas omite — e o motivo mais comum de dois sistemas calcularem HMACs diferentes para a mesma chave.
Três codificações de saída
Produza a tag como Hex (webhooks do GitHub, AWS), Base64 (Stripe, Twilio, muitas APIs) ou Base64URL (JWTs e tokens seguros para URL) para que ela case com sua integração sem conversão manual.
Quatro algoritmos nativos
HMAC-SHA256 por padrão, mais SHA-1, SHA-384 e SHA-512. Todos rodam na Web Crypto API do navegador, então não há biblioteca de cripto em JavaScript em que confiar nem penalidade de desempenho.
100% no lado do cliente e privado
Sua chave secreta e mensagem são processadas inteiramente no seu navegador e nunca enviadas a nenhum servidor. Abra a aba Rede e você verá zero requisições de saída — seguro para segredos de assinatura de produção.
Computação ao vivo
O HMAC é recalculado instantaneamente enquanto você edita a mensagem, a chave, a codificação ou o algoritmo — sem ida e volta de um botão Gerar, então você pode experimentar codificações até seu valor casar com o do servidor.
Baseado em vetores testados
A saída é validada contra os vetores de teste HMAC oficiais da RFC 4231, então você pode confiar que os digests batem com o que o OpenSSL, o módulo crypto do Node e a biblioteca hmac do Python produzem.
Exemplos de HMAC
Início rápido — HMAC-SHA256, saída hex
Hello, World!
cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699
Com a chave "my-secret-key" (Codificação da chave = Texto), algoritmo HMAC-SHA256 e Formato de saída = Hex, a mensagem "Hello, World!" produz cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699. Este é o digest hex canônico de 64 caracteres que você obtém de crypto.createHmac('sha256', key).update(msg).digest('hex') do Node.
Verificar um webhook estilo Stripe (saída Base64)
{"id":42,"event":"user.created"} Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=
Muitos provedores de webhook enviam a assinatura como Base64. Com a chave "whsec_test_secret" (Texto), HMAC-SHA256 e Formato de saída = Base64, o corpo JSON assina como Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=. Cole esse valor na aba Verificar para confirmar que a requisição realmente veio do seu provedor antes de processá-la. Internamente o HMAC roda sobre a mesma primitiva do nosso gerador de hash SHA-256, mas com a chave do seu segredo.
Vetor de referência da RFC 4231
what do ya want for nothing?
5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843
Este é o caso de teste 2 da RFC 4231, o documento oficial de vetores de teste de HMAC. Com a chave "Jefe" (Texto), HMAC-SHA256 e saída Hex, a mensagem "what do ya want for nothing?" resulta em 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843. Bater exatamente com esse valor é como você prova que uma implementação de HMAC está correta.
HMAC-SHA512 para um digest mais longo
The quick brown fox
36f44b125a8a90639dc46733039571792e081e0fd8685ff746784b02ed14aa35629d562c7117cde4a701570551faa5a5e1b7ef1eb5c3bcd4cc1fdb8923fcf14e
Troque o algoritmo para HMAC-SHA512 para um digest de 128 caracteres (512 bits). Com a chave "key" (Texto) e saída Hex, "The quick brown fox" produz o valor acima. O SHA-512 é mais rápido que o SHA-256 na maioria do hardware de 64 bits e gera uma saída maior, embora o SHA-256 continue sendo o padrão de interoperabilidade.
Como Gerar e Verificar um HMAC
- 1
Escolha o algoritmo
Escolha HMAC-SHA256 (o padrão e a escolha certa para quase todos os webhooks, APIs e JWTs), ou mude para SHA-1, SHA-384 ou SHA-512 para casar com um sistema que exija isso. Todos os quatro rodam nativamente no seu navegador via Web Crypto API.
- 2
Informe a chave secreta e defina sua codificação
Digite ou cole sua chave secreta, depois ajuste a Codificação da chave para casar com a forma como o servidor a interpreta: Texto (UTF-8) para uma string simples, Hex para um blob hexadecimal ou Base64 para um segredo em base64. Errar isso é a principal causa de divergências de HMAC, então na dúvida teste as três.
- 3
Informe a mensagem
Cole os bytes exatos que você quer assinar — para um webhook isto é o corpo bruto da requisição, byte a byte, sem re-serialização ou mudanças de espaço em branco. O HMAC é recalculado ao vivo enquanto você edita, sem nada enviado a um servidor.
- 4
Escolha o formato de saída e copie
Selecione Hex (estilo GitHub), Base64 (estilo Stripe/AWS) ou Base64URL (estilo JWT) para casar com o que sua integração espera, depois clique em Copiar para pegar a assinatura.
- 5
Verifique uma assinatura existente
Mude para a aba Verificar, cole o HMAC esperado de um cabeçalho ou token e a ferramenta confirma em tempo constante se a sua assinatura calculada confere — assim você pode autenticar um payload antes de agir sobre ele.
Erros Comuns de HMAC
Divergência na codificação da chave (causa nº 1 de divergências)
O mesmo segredo pode ser lido como texto UTF-8 bruto, como hex ou como base64 — e cada interpretação produz bytes de chave completamente diferentes, então o HMAC não vai bater se a sua ferramenta e o servidor discordarem. Se um provedor lhe dá um segredo em hex ou base64, você precisa decodificá-lo para bytes antes de assinar, não assinar a string como está. Quando uma assinatura falha na verificação, teste primeiro a chave nas três opções de Codificação da chave.
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg) // Decode the base64 secret to raw bytes first
createHmac('sha256', Buffer.from('c2VjcmV0LWtleQ==', 'base64')).update(msg) Divergência na codificação de saída
Um HMAC são bytes brutos; hex, base64 e base64url são apenas codificações de texto diferentes do mesmo valor. Se o servidor envia uma assinatura em base64 e você a compara com o seu digest em hex, eles nunca vão bater mesmo que os bytes subjacentes sejam idênticos. Faça o Formato de saída casar com o que o cabeçalho ou token usa.
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual = digest('hex') // hex — never matches // Produce the same encoding the provider uses
actual = digest('base64') Assinar JSON re-serializado em vez do corpo bruto
As assinaturas de webhook cobrem os bytes exatos que o provedor enviou. Se você faz o parse do JSON e o re-stringifica, a ordem das chaves, o espaçamento e a formatação dos números podem mudar, alterando os bytes e quebrando a assinatura. Sempre faça o HMAC do corpo bruto da requisição capturado antes de qualquer parse.
// Re-serialization changes the bytes body = JSON.stringify(JSON.parse(rawBody)) verify(hmac(body))
// Sign the raw bytes exactly as received verify(hmac(rawBody))
Usar == em vez de uma comparação de tempo constante
Comparar a assinatura recebida com == ou igualdade simples de strings vaza informação de tempo, porque a comparação para no primeiro byte diferente. Ao longo de muitas tentativas um atacante pode recuperar uma tag válida. Sempre use uma checagem de igualdade de tempo constante ao verificar.
if (received === computed) { /* trust */ } if (crypto.timingSafeEqual(receivedBuf, computedBuf)) { /* trust */ } Para Que o HMAC É Usado
- Verificar assinaturas de webhook
- Provedores como GitHub, Stripe, Slack e Twilio assinam cada webhook com HMAC sobre o corpo da requisição e um segredo que só você compartilha. Recalcule a tag e compare-a com o cabeçalho (por exemplo X-Hub-Signature-256) para confirmar que o evento é genuíno antes de agir sobre ele. Use a aba Verificar para fazer isso sem escrever código descartável.
- Assinar requisições de API
- APIs autenticadas muitas vezes exigem que o cliente assine a requisição com HMAC (método, caminho, timestamp, corpo) com um segredo compartilhado em vez de enviar o próprio segredo. O AWS Signature Version 4 é o exemplo canônico. Esta ferramenta permite reproduzir e depurar essas assinaturas passo a passo.
- Garantir a integridade da mensagem
- Quando você passa um token, cookie ou mensagem entre serviços, anexar um HMAC permite que o receptor detecte qualquer adulteração. Como a tag depende de um segredo, um atacante não consegue recalculá-la após modificar os dados — diferente de um checksum simples.
- Entender a assinatura HS256 do JWT
- Um JWT assinado com HS256 é apenas base64url(cabeçalho) + '.' + base64url(payload), assinado com HMAC-SHA256 e o resultado emitido como Base64URL. Defina o algoritmo para SHA-256 e a saída para Base64URL aqui para ver exatamente como essa assinatura é produzida, depois confira de novo no codificador JWT.
- Depurar uma assinatura que não bate
- Quando seu HMAC não bate com o do servidor, esta ferramenta é a forma mais rápida de isolar o porquê: teste a chave como Texto, Hex e Base64, alterne a saída entre Hex e Base64 e confirme que está assinando exatamente os bytes brutos — tudo sem reimplantar nenhum código.
Como o HMAC Funciona
- Construção da RFC 2104
- O HMAC é definido como H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)), onde ipad é o byte 0x36 repetido e opad é o 0x5c repetido, ambos até o tamanho de bloco do hash. Uma chave maior que o tamanho de bloco é primeiro submetida a hash; uma chave menor é preenchida com zeros. Esse aninhamento de duas passagens é o que dá ao HMAC sua prova de segurança, que vale mesmo se o hash subjacente não for resistente a colisões.
- Por que um hash com chave supera um hash simples
- Um hash simples prova apenas que os dados não foram corrompidos por acidente, porque qualquer um pode recalculá-lo para qualquer mensagem — inclusive uma adulterada. O HMAC mistura um segredo, então apenas quem possui a chave pode produzir uma tag válida. Isso converte só-integridade em integridade mais autenticidade, que é a propriedade de que webhooks e requisições assinadas realmente precisam.
- Resistência à extensão de comprimento
- Os SHA-1, SHA-256 e SHA-512 puros são hashes de Merkle–Damgård vulneráveis à extensão de comprimento: dado H(segredo ‖ msg) um atacante pode calcular H(segredo ‖ msg ‖ extra) sem conhecer o segredo. Esquemas ingênuos de 'MAC com prefixo de segredo' são quebrados por isso. O hash externo do HMAC neutraliza o ataque, que é o principal motivo para usar HMAC em vez de submeter um segredo e uma mensagem a hash juntos.
- Escolhendo SHA-256 vs SHA-512
- O HMAC-SHA256 produz uma tag de 256 bits (64 caracteres hex) e é o padrão de interoperabilidade — rápido, onipresente e suportado em toda parte. O HMAC-SHA512 produz uma tag de 512 bits (128 caracteres hex) e costuma ser mais rápido em CPUs de 64 bits porque o SHA-512 usa palavras de 64 bits. Escolha SHA-256 a não ser que uma especificação ou um sistema parceiro exija SHA-512; ambos são seguros para autenticação.
- Implementação com Web Crypto
- Esta ferramenta chama crypto.subtle.importKey para carregar sua chave (decodificada de Texto, Hex ou Base64) e crypto.subtle.sign('HMAC', ...) para calcular a tag, depois codifica os bytes brutos como Hex, Base64 ou Base64URL. É a mesma implementação nativa e auditada que o navegador usa para TLS, rodando fora do motor JavaScript em prol da velocidade.
Boas Práticas de HMAC
- Use uma chave pelo menos tão longa quanto a saída do hash
- Para HMAC-SHA256 use um segredo de pelo menos 32 bytes aleatórios (256 bits); para SHA-512 use 64. Uma chave curta ou de baixa entropia é o elo mais fraco. Gere chaves de uma fonte aleatória criptograficamente segura — nunca uma senha ou uma string previsível.
- Sempre compare as tags em tempo constante
- Verifique assinaturas com uma comparação de tempo constante (crypto.timingSafeEqual no Node, hmac.compare_digest no Python) em vez de == ou igualdade de strings. Uma comparação ingênua retorna cedo no primeiro byte diferente, vazando tempo que pode permitir a um atacante recuperar uma tag válida byte a byte. A aba Verificar desta ferramenta já compara em tempo constante.
- Nunca registre nem exponha a chave secreta
- Mantenha os segredos de assinatura fora de logs, mensagens de erro, URLs e código do lado do cliente. Armazene-os em um gerenciador de segredos ou variáveis de ambiente, rotacione-os periodicamente e dê a cada integração sua própria chave para que um vazamento não comprometa tudo.
- Prefira HMAC-SHA256 ou mais forte
- Use HMAC-SHA256 como padrão; suba para SHA-384 ou SHA-512 quando um parceiro exigir. Evite HMAC-SHA1 em sistemas novos e nunca use HMAC-MD5. Mesmo que o HMAC tolere um hash mais fraco melhor do que uma assinatura pura toleraria, partir de um hash moderno lhe dá a maior margem.
- Assine os bytes exatos, incluindo um timestamp
- Assine o payload bruto e inalterado — re-serializar JSON ou aparar espaços em branco muda os bytes e quebra a verificação. Para assinar requisições, inclua um timestamp ou nonce nos dados assinados e rejeite assinaturas antigas para evitar ataques de repetição.
Perguntas Frequentes sobre HMAC
O que é HMAC?
Como o HMAC difere de um hash simples como o SHA-256?
Como verifico a assinatura de um webhook recebido?
Qual codificação de chave e de saída meu servidor usa?
O HMAC-SHA256 é seguro?
Por que não há HMAC-MD5 ou HMAC-SHA-3 aqui?
HS256 (HMAC) vs RS256 (RSA) — qual usar para JWTs?
Ferramentas relacionadas
Ver todas as ferramentas →Gerador e Verificador de Hash Bcrypt
Ferramentas de Segurança
Gere e verifique hashes bcrypt de senha online — custo ajustável, prefixos $2b$/$2a$/$2y$. 100% no seu navegador; sua senha nunca é enviada.
Decodificador JWT
Ferramentas de Segurança
Decodifique tokens JWT online com nosso decodificador JWT grátis. Inspecione cabeçalho, carga útil, assinatura, expiração e reivindicações. 100% navegador — seu token nunca sai do dispositivo. Sem cadastro, sem rastreio.
Codificador e Gerador JWT
Ferramentas de Segurança
Gerador e codificador JWT online grátis. Monte o cabeçalho e a carga útil, assine com HS256, RS256 ou ES256 instantaneamente. 100% no navegador — seu segredo e sua chave nunca saem do dispositivo.
Gerador de Segredo JWT — HS256/384/512
Ferramentas de Segurança
Gere um segredo JWT forte e correto pela RFC para HS256/384/512 — 100% no navegador, nunca enviado a um servidor. base64url, base64 ou hex; copie para o .env.
Gerador de Hash MD5 e Ferramenta de Checksum
Ferramentas de Segurança
Gere hashes MD5, SHA-256, SHA-1 e SHA-512 online gratuitamente. Faça hash de texto ou arquivos no navegador, verifique checksums e copie resultados. Sem cadastro necessário.
Gerador de Senhas Aleatórias — Forte e Seguro
Ferramentas de Segurança
Gere senhas aleatórias fortes instantaneamente — grátis, sem cadastro, 100% no navegador. Personalize comprimento e tipos de caracteres, gere em lote até 50. Medidor de força com análise de entropia.