Skip to content

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.

Sem rastreamento Roda no navegador Grátis
100% no seu navegador — sua mensagem e chave secreta nunca saem do seu dispositivo.
HMAC gerado

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

✗ Incorreto
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg)
✓ Correto
// 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.

✗ Incorreto
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual   = digest('hex') // hex — never matches
✓ Correto
// 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.

✗ Incorreto
// Re-serialization changes the bytes
body = JSON.stringify(JSON.parse(rawBody))
verify(hmac(body))
✓ Correto
// 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.

✗ Incorreto
if (received === computed) { /* trust */ }
✓ Correto
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?
HMAC (Hash-based Message Authentication Code) é uma forma de provar tanto a integridade quanto a autenticidade de uma mensagem usando uma chave secreta compartilhada. Você passa uma mensagem e uma chave secreta para uma função de hash (aqui SHA-1, SHA-256, SHA-384 ou SHA-512) na construção aninhada específica definida pela RFC 2104 e obtém uma tag de tamanho fixo. Qualquer pessoa que conheça o segredo pode recalcular a tag e confirmar que a mensagem não foi alterada e veio de alguém que possui a chave. É o mecanismo padrão por trás das assinaturas de webhook, das requisições de API assinadas e da família HS256 de tokens JWT.
Como o HMAC difere de um hash simples como o SHA-256?
Um hash simples como o SHA-256 prova apenas a integridade: qualquer um pode recalculá-lo, então qualquer um também pode forjar um hash correspondente para uma mensagem adulterada. O HMAC mistura uma chave secreta, de modo que apenas quem possui essa chave pode produzir ou verificar uma tag válida — isso adiciona autenticidade sobre a integridade. O HMAC também usa uma construção aninhada de duas passagens (hashing interno e externo com pads derivados da chave) que o torna imune aos ataques de extensão de comprimento que afetam o SHA-1 e o SHA-256 puros. Em resumo: use um hash para detectar corrupção acidental, use HMAC para detectar adulteração deliberada por um atacante que não conhece sua chave.
Como verifico a assinatura de um webhook recebido?
Pegue o corpo bruto da requisição exatamente como recebido (não re-serialize o JSON — até chaves reordenadas quebram a assinatura), selecione o mesmo algoritmo que seu provedor usa (geralmente HMAC-SHA256), informe seu segredo de assinatura com a Codificação da chave correta e ajuste o Formato de saída para casar com o cabeçalho (Hex para o prefixo sha256= do GitHub, Base64 para cabeçalhos no estilo Stripe/Twilio). Depois abra a aba Verificar, cole a assinatura do cabeçalho (como X-Hub-Signature-256) e a ferramenta informa se confere ou não usando uma comparação de tempo constante. Só confie no payload se ele conferir.
Qual codificação de chave e de saída meu servidor usa?
Não há resposta universal — depende do seu provedor, e é exatamente por isso que esta ferramenta expõe ambas como escolhas explícitas. Padrões comuns: o GitHub usa um segredo de texto UTF-8 e saída hex minúscula com prefixo sha256=; o Stripe usa um segredo de texto e base64; o AWS Signature V4 usa chaves binárias derivadas e hex; muitos sistemas internos distribuem segredos em base64 ou hex que precisam ser decodificados para bytes brutos antes de assinar. Se o seu HMAC não bater, a codificação é quase sempre a culpada — teste a mesma chave em Texto, Hex e Base64 para encontrar a interpretação que o servidor espera.
O HMAC-SHA256 é seguro?
Sim. O HMAC-SHA256 é amplamente considerado seguro e é o padrão recomendado para autenticação de mensagens. Sua segurança vem da construção HMAC somada a um hash subjacente forte, e ele continua seguro mesmo existindo ataques de colisão contra o hash puro — o HMAC não depende de resistência a colisões da forma que uma assinatura digital depende. Os riscos do mundo real são operacionais, não algorítmicos: uma chave secreta fraca ou vazada, registrar a chave em log ou usar uma comparação que não seja de tempo constante. Use uma chave longa e aleatória, compare as tags em tempo constante e o HMAC-SHA256 vai se sustentar.
Por que não há HMAC-MD5 ou HMAC-SHA-3 aqui?
É por design. Esta ferramenta expõe apenas SHA-1, SHA-256, SHA-384 e SHA-512 porque essas são as funções de hash que a Web Crypto API nativa do navegador suporta, o que mantém tudo rápido e inteiramente no lado do cliente, sem bibliotecas extras. O HMAC-MD5 foi omitido porque o MD5 é obsoleto e você não deve iniciar sistemas novos com ele. O HMAC-SHA-3 foi omitido porque a Web Crypto não implementa o SHA-3; adicioná-lo exigiria embarcar um polyfill em JavaScript. Para praticamente todos os casos de uso modernos, o HMAC-SHA256 é a escolha correta de qualquer forma.
HS256 (HMAC) vs RS256 (RSA) — qual usar para JWTs?
O HS256 assina e verifica um JWT com um único segredo compartilhado usando HMAC-SHA256, enquanto o RS256 assina com uma chave privada RSA e verifica com a chave pública correspondente. Use HS256 quando uma única parte emite e valida os tokens (um monólito, ou serviços internos confiáveis que podem compartilhar o segredo com segurança) — é mais simples e rápido. Use RS256 quando terceiros ou muitos serviços precisam verificar tokens mas não podem cunhá-los, já que você pode distribuir apenas a chave pública. Você pode explorar a estrutura codificada de ambos no codificador JWT; a assinatura HS256 é exatamente um HMAC-SHA256 sobre o cabeçalho e o payload.

Ferramentas relacionadas

Ver todas as ferramentas →