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écnica | Propósito | Segredo necessário |
|---|---|---|
| Hash | Integridade | Não |
| Salt | Unicidade do hash | Não (é público) |
| HMAC | Autenticação + integridade | Sim (chave) |