DEV Community

Determinado 96
Determinado 96

Posted on

Um resumo sobre o padrão de segurança HMAC

Definição

O HMAC (Hash-based Message Authentication Code) é um mecanismo de segurança que permite verificar a integridade e autenticidade de uma mensagem, garantindo que ela não foi alterada e que foi gerada por quem possui uma chave secreta. Ele é muito usado em autenticação de APIs, tokens e assinaturas digitais.

Analogia

Imagine que você envia uma carta dentro de um envelope lacrado com um selo exclusivo que só você e o destinatário conhecem a forma de produzir. Se alguém abrir a carta e alterar qualquer palavra, o selo não vai mais bater com o original. O HMAC funciona exatamente assim: ele “lacra” os dados com uma assinatura impossível de reproduzir sem a chave secreta.

Exemplo sem HMAC (inseguro)

$payload = [
  'user' => 'joao',
  'exp' => time() + 300
];

// token simples sem proteção
$token = base64_encode(json_encode($payload));
Enter fullscreen mode Exit fullscreen mode

Problema

Qualquer pessoa pode:

  • decodificar o token
  • alterar exp
  • reencodar
  • e enganar o sistema

Exemplo com HMAC (seguro)

$payload = [
  'user' => 'joao',
  'exp' => time() + 300
];

$secret = 'chave_super_secreta';

$signature = hash_hmac(
  'sha256',
  json_encode($payload['user']) . '|' . $payload['exp'],
  $secret
);

$payload['sig'] = $signature;

$token = base64_encode(json_encode($payload));
Enter fullscreen mode Exit fullscreen mode

Validação do lado do servidor

$payload = json_decode(base64_decode($_GET['token']), true);

$check = hash_hmac(
  'sha256',
  json_encode($payload['user']) . '|' . $payload['exp'],
  $secret
);

if (!hash_equals($check, $payload['sig'])) {
  die("Token inválido");
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)