Iniciante Criptografia

Hash, salt e HMAC

Funções de hash são ferramentas fundamentais em segurança. Transformam qualquer dado em uma saída de tamanho fixo — chamada de digest — de forma irreversível.

O que é uma função de hash

Propriedades essenciais:

  • Determinística: mesma entrada, mesma saída.
  • Irreversível: não dá para obter a entrada a partir da saída.
  • Efeito avalanche: uma mudança mínima na entrada muda completamente a saída.
  • Livre de colisão: entradas diferentes produzem saídas diferentes (na prática).
echo -n "senha123" | sha256sum
# b94f6f125c79e3a5ffaa826f584c10d52ada669e6762051b826b55776d05a8d  -

Algoritmos modernos: SHA-256, SHA-384, SHA-512, SHA-3. Evite: MD5, SHA-1 — quebrados para fins de segurança.

O problema dos hashes sem salt

Hashes puros são vulneráveis a rainbow tables — tabelas pré-computadas que mapeiam hashes para senhas comuns.

sha256("123456") = 8d969eef6ecad3c29a3a629280e686cf...
# Qualquer banco de rainbow table reverte isso em segundos

Salt: unicidade garantida

Salt é um valor aleatório adicionado à entrada antes de calcular o hash. Cada usuário tem seu próprio salt.

salt = "xK9#mQ2p"  (gerado aleatoriamente por usuário)
hash = sha256("senha123" + salt)

O salt é armazenado em claro junto ao hash. Seu objetivo não é ser secreto — é tornar ataques de dicionário inviáveis.

import hashlib, os

salt = os.urandom(16)
senha = b"minha_senha"
digest = hashlib.sha256(salt + senha).hexdigest()
# Armazena: salt (hex) + digest

Para senhas, prefira funções de derivação como bcrypt ou argon2 (tema da lição 6).

HMAC: autenticação de mensagem

HMAC (Hash-based Message Authentication Code) combina hash com uma chave secreta. Garante que a mensagem não foi alterada e que quem a assinou conhece a chave.

HMAC(chave, mensagem) = hash(chave ⊕ pad || hash(chave ⊕ pad || mensagem))

Na prática:

import hmac, hashlib

chave = b"chave_secreta"
mensagem = b"pedido de pagamento: R$500"

mac = hmac.new(chave, mensagem, hashlib.sha256).hexdigest()
print(mac)
# Receptor recalcula e compara — se diferente, mensagem foi alterada

Usos do HMAC: tokens de sessão, webhooks (verificação de payload), APIs REST.

Resumo

TécnicaPropósitoSegredo necessário
HashIntegridadeNão
SaltUnicidade do hashNão (é público)
HMACAutenticação + integridadeSim (chave)