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