# Gerador de HMAC online

> O HMAC é um código calculado a partir de uma mensagem e de uma chave secreta, usado para provar que a mensagem veio de quem tem a chave e não foi alterada, como nas assinaturas de webhooks e de APIs. Esta ferramenta calcula HMAC-SHA256, SHA1, SHA384, SHA512 e MD5 no seu navegador e ainda confere uma assinatura recebida, sem enviar a mensagem nem a chave a nenhum servidor.

- Endereço oficial: https://pradev.com.br/gerador-de-hmac
- Categoria: Codificação e segurança
- Tipo: Gerador
- Atualizado em: 2026-09-30
- Autor: Leonardo Gaertner (https://pradev.com.br/sobre)
- Preço: grátis, sem cadastro. O processamento acontece no navegador de quem usa.

## Como usar

1. Digite ou cole a mensagem e a chave secreta.
2. Escolha o algoritmo (o mais usado é o HMAC-SHA256) e em que formato a chave está: texto, hexadecimal ou Base64.
3. Copie o resultado em hexadecimal ou Base64.
4. Para conferir uma assinatura de webhook, cole-a no último campo, com ou sem o prefixo sha256=.

## Como funciona

O HMAC, definido na RFC 2104, mistura a chave com a mensagem em duas rodadas de uma função de hash: HMAC(K, m) = H((K xor opad) seguido de H((K xor ipad) seguido de m)). Uma chave maior que o bloco da função (64 bytes para SHA-256, 128 para SHA-512) é reduzida com o próprio hash antes.

O resultado só bate com o do outro lado se os bytes forem exatamente os mesmos. Isso vale para a chave, cujo formato importa (uma chave em Base64 tratada como texto gera outro HMAC), e para a mensagem: use o corpo original da requisição, sem reformatar o JSON e sem espaços ou quebras de linha a mais no fim. O texto é convertido para UTF-8 antes do cálculo.

Colisões conhecidas no MD5 e no SHA-1 não quebram o HMAC da mesma forma, mas para projetos novos a recomendação é usar HMAC-SHA256 ou superior. O HMAC prova autenticidade e integridade, e não esconde a mensagem: ele não é criptografia.

### Exemplo (HMAC-SHA256)

```text
Chave: key
Mensagem: The quick brown fox jumps over the lazy dog
HMAC: f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
```

## Em código

Para conferir a assinatura HMAC-SHA256 de um webhook, compare o valor recebido com o calculado sobre o corpo original, em tempo constante.

```javascript
import { createHmac, timingSafeEqual } from 'node:crypto';

// corpo: o corpo ORIGINAL da requisição (Buffer ou texto, sem reformatar)
// cabecalho: o valor do cabeçalho de assinatura, por exemplo "sha256=ab12..."
function assinaturaValida(corpo, segredo, cabecalho) {
  const esperada = 'sha256=' + createHmac('sha256', segredo).update(corpo).digest('hex');
  const a = Buffer.from(cabecalho ?? '');
  const b = Buffer.from(esperada);
  return a.length === b.length && timingSafeEqual(a, b);
}
```

_JavaScript. Node.js._

```python
import hashlib
import hmac


def assinatura_valida(corpo: bytes, segredo: str, cabecalho: str | None) -> bool:
    esperada = "sha256=" + hmac.new(segredo.encode(), corpo, hashlib.sha256).hexdigest()
    return hmac.compare_digest(esperada.encode(), (cabecalho or "").encode())
```

_Python_

```php
<?php
// $corpo: o corpo ORIGINAL da requisição, por exemplo file_get_contents('php://input')
// $cabecalho: por exemplo $_SERVER['HTTP_X_HUB_SIGNATURE_256'] ?? null
function assinaturaValida(string $corpo, string $segredo, ?string $cabecalho): bool
{
    $esperada = 'sha256=' . hash_hmac('sha256', $corpo, $segredo);
    return hash_equals($esperada, $cabecalho ?? '');
}
```

_PHP_

## Perguntas frequentes

### Qual a diferença entre HMAC e um hash comum?

Qualquer pessoa consegue calcular um hash comum de uma mensagem. O HMAC exige a chave secreta, então só quem a tem consegue gerar ou conferir o código, o que prova a origem da mensagem.

### Por que o meu HMAC não bate com o do servidor?

As causas mais comuns são o formato da chave (texto, hexadecimal ou Base64), uma mensagem diferente da original (espaços, quebra de linha no fim, JSON reformatado), o algoritmo errado e o uso de um corpo de requisição já alterado. Confira a chave e a mensagem byte a byte.

### HMAC é criptografia?

Não. O HMAC não esconde o conteúdo da mensagem, ele só permite verificar se ela é autêntica e não foi modificada. Para esconder o conteúdo, é preciso criptografar.

### É seguro colar a minha chave aqui?

O cálculo acontece no seu navegador e a chave não é enviada ao PraDev. Mesmo assim, chaves de produção são credenciais: prefira usar uma chave de teste, e nunca compartilhe uma chave real.

### Como comparar assinaturas no servidor com segurança?

Use uma comparação de tempo constante, como crypto.timingSafeEqual no Node.js ou hmac.compare_digest no Python, em vez de ==, para não vazar informação pelo tempo de resposta.

## Fontes

- [RFC 2104: HMAC](https://datatracker.ietf.org/doc/html/rfc2104)
- [RFC 4231: vetores de teste do HMAC com SHA-2](https://www.rfc-editor.org/rfc/rfc4231)

## Guias

- [Como decodificar e verificar um JWT em JavaScript e Python](https://pradev.com.br/guias/como-decodificar-e-verificar-jwt): Entenda a diferença entre decodificar e verificar um JWT e veja código testado em JavaScript e Python para ler o token e checar a assinatura HS256.
- [Como validar a assinatura de um webhook com HMAC](https://pradev.com.br/guias/como-validar-assinatura-de-webhook-hmac): Aprenda a conferir a assinatura HMAC-SHA256 de webhooks em Node.js, Python e PHP, com código testado e os erros que fazem a validação falhar.

## Ferramentas relacionadas

- [Gerador de Hash](https://pradev.com.br/gerador-de-hash): Gere hash MD5, SHA-1, SHA-256, SHA-384 e SHA-512 de um texto ou arquivo. Grátis, e o conteúdo não sai do navegador.
- [Gerador de SHA256](https://pradev.com.br/gerador-de-sha256): Gere o hash SHA-256 de um texto ou arquivo online, em hexadecimal ou Base64. Grátis, e o conteúdo não sai do navegador.
- [Decodificador JWT](https://pradev.com.br/decodificador-jwt): Decodifique um JWT online e veja header, payload e datas de exp, iat e nbf. O token não sai do navegador. Não verifica a assinatura.
- [Codificar Base64](https://pradev.com.br/codificar-base64): Converta texto para Base64 online, com suporte a acentos (UTF-8) e opção URL-safe. Grátis, no navegador, sem enviar seus dados.
- [Decodificar Base64](https://pradev.com.br/decodificar-base64): Decodifique Base64 para texto online, com suporte a UTF-8 e Base64 URL-safe. Grátis, direto no navegador, sem enviar seus dados.
- [Gerador de UUID](https://pradev.com.br/gerador-de-uuid): Gere UUID v4 aleatório com um clique: em lote, em maiúsculas, com ou sem hífens. Grátis, gerado no seu navegador.
