Parte II · 2 — Hash, MAC e KDF

draft

Cifrar protege o segredo; hash, MAC e KDF protegem a integridade, a autoria e as próprias chaves. São as primitivas mais reutilizadas — e as mais mal-usadas (senhas em SHA-256 "porque é seguro" é um clássico erro).


2.1 Funções de hash criptográficas

Um hash comprime uma entrada de qualquer tamanho num digest de tamanho fixo (ex.: 256 bits). Para ser criptográfico, precisa de três propriedades:

Propriedade Significado Se quebrada…
Resistência a pré-imagem Dado um digest, é inviável achar uma entrada que o gere. Quebra senhas, compromissos.
Resistência a 2ª pré-imagem Dada uma entrada, é inviável achar outra com o mesmo digest. Forja documentos.
Resistência a colisão É inviável achar quaisquer duas entradas com o mesmo digest. Quebra assinaturas (foi o fim do MD5 e SHA-1).

Efeito avalanche: mudar um bit da entrada muda ~metade dos bits do digest.

Hash: função de mão única com efeito avalanche


2.2 Quais hashes usar (2026)

Hash Veredito
MD5, SHA-1 quebrados (colisões práticas). Só para checksums não-adversariais.
SHA-256 / SHA-512 (SHA-2) ✅ padrão sólido, onipresente.
SHA-3 / Keccak ✅ desenho diferente do SHA-2 (esponja) — bom hedge.
BLAKE3 ✅ muito rápido, paralelizável; ótimo para integridade de arquivos.

Um hash não é para guardar senhas. Ele é rápido de propósito — o que ajuda o atacante a testar bilhões por segundo. Senhas pedem uma KDF lenta (seção 2.5).


2.3 MAC: integridade com autoria

Um hash garante que o dado não mudou — mas qualquer um pode recalcular o hash de um dado alterado. Um MAC (Message Authentication Code) acrescenta uma chave secreta: só quem a tem produz uma tag válida. Prova integridade e origem (entre quem partilha a chave).

  • HMAC — constrói um MAC a partir de um hash (HMAC-SHA-256). Maduro, padrão.
  • Poly1305 — MAC rápido, usado em AEAD com ChaCha20.

Lembre da distinção da Parte I: MAC usa chave compartilhada (não dá não-repúdio); assinatura usa chave privada (dá). E sempre compare tags em tempo constante — comparar byte a byte com saída antecipada vira um canal lateral de timing.


2.4 KDF: derivar chaves de outras chaves

Uma KDF (Key Derivation Function) produz chaves a partir de outro material. Dois usos distintos:

  • Derivação de material chave — a partir de um segredo de alta entropia

    (ex.: o resultado de um Diffie-Hellman), gerar várias subchaves. Use HKDF (HMAC-based KDF): extract (concentra a entropia) + expand (gera bytes).

  • Esticar entropia baixa — material previsível precisa de uma KDF

    deliberadamente cara — é o caso das senhas, abaixo.


2.5 Hashing de senhas: o caso especial

Senhas têm entropia baixa e humana. Guardá-las exige uma função lenta e com custo de memória, mais um salt único por senha:

Função Nota
Argon2id ✅ recomendação atual (resistente a GPU/ASIC por custo de memória).
scrypt ✅ boa alternativa com custo de memória.
bcrypt ✅ aceitável (legado sólido), sem custo de memória.
PBKDF2 ⚠️ só quando exigido por norma; configure iterações altas.
SHA-256 cru ❌ rápido demais — quebrável em massa.
  • Salt — valor público aleatório, único por senha, para que senhas

    iguais gerem hashes diferentes e quebrem rainbow tables. Armazenado junto.

  • Pepper — segredo fixo do sistema, aplicado a todas as senhas e não

    guardado no banco; some com o segredo se o banco vazar sozinho.

Regra: senha → Argon2id (com salt por usuário). Material de chave de um handshake → HKDF. Nunca troque um pelo outro.


Referência densa: o catálogo completo de hashes (BLAKE2, SHA-3, RIPEMD, Streebog, SM3), HMAC e KDFs está em 06-hash-e-mac. A seguir: o salto para a criptografia assimétrica — onde os dois lados deixam de precisar de um segredo prévio.