utildev
← Blog
Hash & Criptografia5 min

O que é HMAC e quando usar?

Entenda o que é HMAC (Hash-based Message Authentication Code), como difere do hash simples, e por que é essencial para verificar a autenticidade de webhooks e APIs.

HMAC (Hash-based Message Authentication Code) é um mecanismo de autenticação de mensagens que combina uma função de hash criptográfica com uma chave secreta. Diferente de um hash simples, o HMAC permite que duas partes que compartilham uma chave verifiquem tanto a integridade quanto a autenticidade de uma mensagem.

Por que HMAC é mais seguro que um hash simples?

Um hash SHA-256 puro é vulnerável a ataques de extensão de comprimento (length extension attacks). Se um atacante conhece o hash de uma mensagem, pode calcular o hash de "mensagem + dados_extras" sem conhecer o segredo, forjando assim mensagens. O HMAC elimina essa vulnerabilidade ao combinar a chave com a mensagem de forma que não é possível estender.

HMAC(key, message) = H((key XOR opad) || H((key XOR ipad) || message))

// Em Node.js:
const { createHmac } = require('crypto');
const hmac = createHmac('sha256', 'meu-segredo')
  .update('payload da mensagem')
  .digest('hex');
console.log(hmac); // signature verificável

Casos de uso do HMAC

  • Verificação de webhooks: GitHub, Stripe, Shopify assinam payloads com HMAC-SHA256
  • Autenticação de APIs: HMAC como alternativa a tokens Bearer em APIs server-to-server
  • Assinatura de cookies: garantir que o conteúdo do cookie não foi adulterado
  • Integridade de mensagens: verificar que uma mensagem não foi modificada em trânsito

Verificando a assinatura de um webhook

Ao verificar assinaturas HMAC de webhooks, use comparação em tempo constante (timingSafeEqual) para evitar timing attacks. Nunca compare strings HMAC com === comum.
const { createHmac, timingSafeEqual } = require('crypto');

function verifyWebhook(payload, signature, secret) {
  const expected = createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

HMAC é sempre "HMAC-{algoritmo-de-hash}" — os mais comuns são HMAC-SHA256 e HMAC-SHA512. MD5 e SHA-1 não são recomendados para novas implementações. Use o Gerador de HMAC do UtilDev para calcular assinaturas e verificar implementações.

Ferramentas relacionadas

Gerador de HMAC
Gere códigos HMAC com chaves secretas

Artigos relacionados

O que é JWT e como funciona?7 min →SHA-256 vs MD5: qual usar para segurança?6 min →