Gerador HMAC

Gere assinaturas HMAC com SHA-256, SHA-384 ou SHA-512

Algoritmo

Mensagem

Roda localmente · Seguro para colar segredos

Chave Secreta

Roda localmente · Seguro para colar segredos

Assinatura HMAC

A assinatura HMAC aparecerá aqui…

O Que É HMAC?

HMAC (Hash-based Message Authentication Code) é uma construção criptográfica definida na RFC 2104 que combina uma função hash com uma chave secreta para produzir uma tag de autenticação de tamanho fixo. Ao contrário de um hash simples, que qualquer pessoa pode calcular, um HMAC só pode ser gerado e verificado por partes que compartilham a chave secreta. O HMAC é o mecanismo padrão para verificar tanto a integridade quanto a autenticidade de uma mensagem — confirmando que os dados não foram alterados e que foram produzidos por um remetente confiável.

O algoritmo HMAC funciona com qualquer função hash iterativa: SHA-256, SHA-384, SHA-512 e até funções legadas como SHA-1 ou MD5. A construção resultante é referenciada pelo hash subjacente — HMAC-SHA256, HMAC-SHA384 ou HMAC-SHA512. Como a prova de segurança do HMAC depende de a função hash ser resistente a colisões e ter certas propriedades pseudoaleatórias, os algoritmos da família SHA-2 são a escolha recomendada para novos sistemas. O HMAC-SHA256 é a variante mais amplamente implantada, utilizada em AWS Signature V4, webhooks do Stripe, segredos de webhook do GitHub, assinatura de requisições do Slack e JSON Web Tokens (HS256).

O design do HMAC oferece uma propriedade crítica que o hash simples não possui: resistência a ataques de extensão de comprimento. Com SHA-256 sozinho, um atacante que conhece H(mensagem) pode calcular H(mensagem || dados_do_atacante) sem conhecer a mensagem original. A estrutura de duplo hash do HMAC (hash interno e hash externo com chaves preenchidas diferentes) previne completamente esse ataque. É por isso que os esquemas de assinatura de API usam HMAC em vez de concatenar uma chave secreta à mensagem e fazer hash do resultado.

Por Que Usar um Gerador HMAC Online?

Calcular assinaturas HMAC normalmente requer escrever código ou usar ferramentas de linha de comando. Este gerador HMAC baseado em navegador permite criar assinaturas HMAC-SHA256, HMAC-SHA384 e HMAC-SHA512 instantaneamente, sem instalar software ou abrir um terminal.

Cálculo instantâneo de HMAC
Insira sua mensagem e chave secreta, selecione o algoritmo hash e obtenha a assinatura HMAC imediatamente. A Web Crypto API cuida do cálculo de forma nativa no seu navegador.
🔒
Processamento com privacidade garantida
Sua mensagem e chave secreta nunca saem do seu dispositivo. Todo o cálculo HMAC é executado localmente via Web Crypto API — sem requisições ao servidor, sem registro de logs, sem retenção de dados.
📋
Suporte a múltiplos algoritmos
Alterne entre HMAC-SHA256, HMAC-SHA384 e HMAC-SHA512 com um clique. Compare os resultados entre os algoritmos para verificar se sua implementação no backend está correta.
🔍
Sem conta ou instalação
Funciona em qualquer navegador moderno — Chrome, Firefox, Safari, Edge. Sem cadastro, sem extensão, sem configuração de CLI. Abra a página e comece a gerar assinaturas HMAC.

Casos de Uso do Gerador HMAC

Desenvolvedor Frontend — Verificação de Assinatura de Webhook
Stripe, GitHub e Shopify assinam os payloads de webhook com HMAC-SHA256. Use esta ferramenta para calcular a assinatura esperada a partir de um payload e segredo, e depois compare com a assinatura no cabeçalho HTTP durante o desenvolvimento.
Engenheiro Backend — Assinatura de Requisições de API
O AWS Signature V4 exige HMAC-SHA256 em múltiplas etapas do processo de assinatura. Gere valores HMAC de referência durante o desenvolvimento para depurar incompatibilidades de assinatura e verificar etapas intermediárias de cálculo.
DevOps — Validação de Rotação de Segredos
Ao rotacionar segredos de webhook ou chaves de assinatura de API, calcule assinaturas HMAC com a chave antiga e a nova para confirmar que sua aplicação gerencia corretamente a transição antes que a chave antiga expire.
Engenheiro de QA — Vetores de Teste de Assinatura
Gere vetores de teste HMAC com entradas e chaves conhecidas para criar testes de regressão para seu middleware de autenticação. Verifique se sua implementação trata corretamente mensagens vazias, entradas Unicode e chaves longas.
Engenheiro de Dados — Autenticação de Mensagens em Pipelines
Anexe assinaturas HMAC às mensagens em pipelines orientados a eventos (Kafka, SQS) para verificar que as mensagens não foram adulteradas durante o trânsito entre serviços.
Estudante — Trabalhos de Criptografia
Experimente com HMAC para entender como a alteração de um único caractere na mensagem ou na chave produz uma assinatura completamente diferente. Compare a saída do HMAC com a saída do SHA-256 simples para observar a diferença que uma chave secreta introduz.

HMAC vs Hash Simples vs Criptografia

HMAC, hash simples e criptografia servem a propósitos diferentes. O HMAC fornece autenticação de mensagem — prova de que a mensagem foi criada por alguém com a chave secreta e não foi modificada. Um hash simples fornece integridade, mas não autenticação. A criptografia fornece confidencialidade. A tabela abaixo esclarece as distinções.

PropriedadeHMACPlain HashEncryption
PurposeMessage authentication + integrityData integrity only (no key)Confidentiality + integrity
Requires secret keyYesNoYes
Verifiable byParties who share the secretAnyoneRecipient with key
ReversibleNo — digest onlyNo — digest onlyYes — decryption recovers data
Output sizeDepends on hash (e.g. 256 bits)Depends on hashVariable (ciphertext)
StandardRFC 2104FIPS 180-4NIST SP 800-38A (AES)
Use case exampleWebhook signature verificationFile checksum verificationEncrypting data at rest

Comparação de Algoritmos HMAC

O HMAC pode usar qualquer função hash, mas a escolha do algoritmo subjacente determina o tamanho da saída, o nível de segurança e a compatibilidade com o navegador. O HMAC-SHA256 é a opção mais comum para novos sistemas. A tabela abaixo compara as variantes que você provavelmente encontrará.

AlgoritmoTamanho do ResumoComprimento HexWeb Crypto APIIdeal Para
HMAC-SHA256256 bits64 hex charsYesAPI signing, webhooks, JWT (HS256)
HMAC-SHA384384 bits96 hex charsYesTLS 1.3 PRF, CNSA compliance
HMAC-SHA512512 bits128 hex charsYesHigh-security signatures, HKDF
HMAC-SHA1160 bits40 hex charsYesLegacy OAuth 1.0, TOTP (RFC 6238)
HMAC-MD5128 bits32 hex charsNoLegacy only — not recommended

Como o HMAC Funciona Internamente

O HMAC aplica a função hash subjacente duas vezes com dois preenchimentos derivados de chaves diferentes. A construção é definida na RFC 2104 e provada ser uma PRF (função pseudoaleatória) sob suposições criptográficas padrão. A chave é primeiro preenchida ou hasheada para corresponder ao tamanho do bloco da função hash (64 bytes para SHA-256, 128 bytes para SHA-512).

HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
where K' = key padded to block size, ipad = 0x36, opad = 0x5C

O algoritmo realiza XOR da chave preenchida com uma constante de preenchimento interna (ipad, 0x36 repetido), concatena com a mensagem e aplica hash ao resultado. Em seguida, realiza XOR da chave preenchida com uma constante de preenchimento externa (opad, 0x5C repetido), concatena com o resultado do hash interno e aplica hash novamente. Essa estrutura de duplo hash é o que previne ataques de extensão de comprimento e garante que a saída do HMAC não possa ser calculada sem conhecimento da chave secreta.

Exemplos de Código HMAC

O HMAC é suportado nativamente em todas as principais linguagens e runtimes. A Web Crypto API fornece HMAC-SHA256, HMAC-SHA384 e HMAC-SHA512 nos navegadores sem nenhuma biblioteca. Os exemplos abaixo mostram padrões de uso reais, incluindo verificação de webhook e comparação em tempo constante.

JavaScript (Web Crypto API)
async function hmacSHA256(message, secret) {
  const enc = new TextEncoder()
  const key = await crypto.subtle.importKey(
    'raw', enc.encode(secret),
    { name: 'HMAC', hash: 'SHA-256' },
    false, ['sign']
  )
  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message))
  return Array.from(new Uint8Array(sig))
    .map(b => b.toString(16).padStart(2, '0')).join('')
}

await hmacSHA256('hello world', 'my-secret-key')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHmac('sha256', 'my-secret-key')
  .update('hello world').digest('hex')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
Python
import hmac
import hashlib

# HMAC-SHA256
sig = hmac.new(
    b'my-secret-key',
    b'hello world',
    hashlib.sha256
).hexdigest()
print(sig)
# → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

# Verify a webhook signature (constant-time comparison)
expected = "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
received = hmac.new(b'my-secret-key', b'hello world', hashlib.sha256).hexdigest()
if hmac.compare_digest(expected, received):
    print("Signature valid")

# HMAC-SHA512
hmac.new(b'key', b'data', hashlib.sha512).hexdigest()
Go
package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "fmt"
)

func main() {
    mac := hmac.New(sha256.New, []byte("my-secret-key"))
    mac.Write([]byte("hello world"))
    sig := mac.Sum(nil)
    fmt.Printf("%x\n", sig)
    // → 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

    // Verify: use hmac.Equal for constant-time comparison
    expected := mac.Sum(nil)
    fmt.Println(hmac.Equal(sig, expected)) // true
}
CLI (OpenSSL)
# HMAC-SHA256
echo -n "hello world" | openssl dgst -sha256 -hmac "my-secret-key"
# → SHA2-256(stdin)= 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

# HMAC-SHA512
echo -n "hello world" | openssl dgst -sha512 -hmac "my-secret-key"

# Verify a file signature
openssl dgst -sha256 -hmac "my-secret-key" release.tar.gz

# HMAC with hex key (e.g. from a webhook secret)
echo -n "payload" | openssl dgst -sha256 -hmac "$(echo -n '736563726574' | xxd -r -p)"

Perguntas Frequentes

Qual é a diferença entre HMAC e um hash simples?
Um hash simples (SHA-256, MD5) recebe apenas uma mensagem como entrada e produz um resumo que qualquer pessoa pode calcular. O HMAC recebe tanto uma mensagem quanto uma chave secreta, produzindo uma assinatura que só alguém com a chave pode gerar ou verificar. Isso significa que o HMAC fornece autenticação (prova de identidade do remetente) além da verificação de integridade. Um hash simples apenas prova que os dados não foram alterados, não quem os produziu.
O HMAC-SHA256 é seguro?
Sim. O HMAC-SHA256 é considerado seguro até 2026. Sua segurança depende das propriedades pseudoaleatórias do SHA-256 e da própria construção HMAC (RFC 2104). Nenhum ataque prático contra o HMAC-SHA256 foi demonstrado. Mesmo HMAC-MD5 e HMAC-SHA1 permanecem seguros na prática, pois a segurança do HMAC não exige resistência total a colisões do hash subjacente, embora as variantes SHA-2 sejam recomendadas para novos sistemas.
Por que os webhooks usam HMAC em vez de criptografar o payload?
Os payloads de webhook geralmente contêm dados que o receptor já espera — detalhes de pedidos, notificações de eventos, atualizações de status. O objetivo não é ocultar os dados (confidencialidade), mas provar que vieram do remetente legítimo e não foram modificados em trânsito (autenticidade e integridade). O HMAC alcança isso com overhead mínimo: o remetente calcula um HMAC do payload com um segredo compartilhado e o inclui em um cabeçalho HTTP. O receptor recalcula o HMAC e compara. A criptografia adicionaria complexidade desnecessária e sobrecarga no gerenciamento de chaves.
Como devo comparar assinaturas HMAC com segurança?
Sempre use uma função de comparação em tempo constante. Em Python, use hmac.compare_digest(). Em Node.js, use crypto.timingSafeEqual(). Em Go, use hmac.Equal(). Operadores de igualdade de string padrão (== ou ===) podem vazar informações de temporização: um atacante pode medir quanto tempo leva a comparação para determinar quantos bytes de sua assinatura forjada correspondem à correta, e então forçar os bytes restantes um a um.
O HMAC pode ser revertido para recuperar a chave secreta?
Não. O HMAC é baseado em uma função hash unidirecional, portanto não existe atalho matemático para extrair a chave de uma saída HMAC. Um atacante precisaria forçar por bruta o espaço de chaves, o que é inviável para chaves de 128 bits ou mais. No entanto, chaves fracas ou curtas (como senhas simples) podem ser vulneráveis a ataques de dicionário, portanto sempre use chaves aleatórias criptograficamente seguras de pelo menos 256 bits para HMAC-SHA256.
O que acontece se a chave HMAC for maior que o tamanho do bloco do hash?
Se a chave secreta for maior que o tamanho do bloco da função hash (64 bytes para SHA-256, 128 bytes para SHA-512), o algoritmo HMAC primeiro aplica hash à chave com a função hash subjacente para reduzi-la ao comprimento da saída do hash, e então usa esse hash como chave efetiva. Isso significa que chaves muito longas não oferecem segurança adicional além do tamanho da saída do hash. Para HMAC-SHA256, chaves maiores que 64 bytes são hasheadas para 32 bytes e não oferecem nenhuma melhoria de segurança em relação a uma chave de 64 bytes; chaves de até 64 bytes são usadas em seu comprimento total.
Quando devo usar HMAC-SHA512 em vez de HMAC-SHA256?
Use HMAC-SHA512 quando o protocolo exigir (algumas funções de derivação de chave como HKDF-SHA512, geração de chaves Ed25519), quando precisar de uma assinatura mais ampla para defesa em profundidade, ou quando executar em hardware de 64 bits onde o SHA-512 é de fato mais rápido que o SHA-256. Para a maioria das aplicações web, assinatura de API e verificação de webhook, o HMAC-SHA256 oferece segurança suficiente e é a escolha mais comum nos ecossistemas.