04 - Funções Hash
video: https://youtu.be/... no frontmatter da nota.Funções Hash Criptográficas
As Funções Hash (ou Funções Resumo) são descritas pelas fontes como um método criptográfico fundamental para garantir a integridade da informação dentro do ecossistema de comunicação segura. Diferente da cifragem, que foca na confidencialidade, o hash atua como uma "impressão digital" única para os dados.
1. Definição e Propriedades Técnicas
Uma função hash é um algoritmo matemático que, ao ser aplicado sobre qualquer informação (independentemente do seu tamanho), gera um resultado de tamanho fixo e exclusivo, denominado hash ou digest. Formalmente, trata-se de uma função H: {0,1}* → {0,1}^n que mapeia uma entrada de comprimento arbitrário para uma saída de n bits.
Propriedades Criptográficas Essenciais
- Determinística: A mesma entrada produz sempre a mesma saída, em qualquer implementação.
- Computação rápida: Calcular
H(m)é barato (complexidade linear ou sublinear no tamanho da mensagem). - Efeito avalanche: A alteração de 1 bit na entrada modifica em média metade dos bits da saída (dispersão máxima).
- Resistência à pré-imagem (unidirecionalidade): Dado um hash
h, é computacionalmente inviável encontrarmtal queH(m) = h. - Resistência à segunda pré-imagem: Dada uma mensagem
m1, é inviável encontrarm2 ≠ m1tal queH(m1) = H(m2). - Resistência a colisões: É inviável encontrar qualquer par
(m1, m2)comm1 ≠ m2tal queH(m1) = H(m2).
O paradoxo do aniversário garante que, para uma função com n bits de saída, uma colisão pode ser encontrada com cerca de 2^(n/2) operações — daí a recomendação de no mínimo 256 bits para segurança a longo prazo.
2. Papel na Tríade CIA (Integridade)
No contexto dos pilares da segurança (Confidencialidade, Integridade e Disponibilidade), as funções hash são o principal mecanismo de suporte à Integridade. Elas permitem verificar se o dado foi corrompido, modificado acidentalmente ou alterado por um agente mal-intencionado durante o trânsito ou armazenamento. Se os hashes da origem e do destino forem idênticos, conclui-se que o arquivo está isento de erros e é verdadeiro (do ponto de vista da integridade, não necessariamente da autenticidade).
3. Algoritmos Históricos e Modernos
| Algoritmo | Bits de saída | Status | RFC / Spec | Observação |
|---|---|---|---|---|
| MD5 | 128 | Quebrado | RFC 1321 (1992) | Colisões práticas desde 2004 (Wang); nunca usar para segurança |
| SHA-1 | 160 | Quebrado | RFC 3174 (1995) | SHAttered (2017): colisão real por Google/CWI |
| SHA-256 | 256 | Seguro | RFC 6234 (FIPS 180-4) | Padrão atual da indústria |
| SHA-512 | 512 | Seguro | RFC 6234 | Mais lento em 32-bit, ótimo em 64-bit |
| SHA-3 (Keccak) | 224/256/384/512 | Seguro | FIPS 202 (2015) | Estrutura sponge, diferente do SHA-2 |
| BLAKE2b/s | até 512 | Seguro | RFC 7693 | Mais rápido que MD5 em hardware moderno |
| BLAKE3 | ilimitado | Seguro | Spec aberta | Paralelismo massivo, tree mode nativo |
Por que MD5 e SHA-1 estão quebrados?
- MD5: Em 2004, Wang et al. demonstraram colisões em poucos minutos. Em 2008, pesquisadores criaram um CA certificado fraudulento usando colisão seletiva de prefixo. Ataca-se também com length extension attacks.
- SHA-1: O ataque SHAttered (Google/CWI, 2017) quebrou o SSL/TLS em ambientes antigos e reduziu a confiança em assinaturas PGP/Git. O Git migrou para SHA-256 em 2023.
4. Aplicações Práticas em Comunicação Segura
- Assinaturas Digitais: O hash é usado para gerar assinaturas que garantem a autenticidade e a integridade de um documento eletrônico, provando que ele realmente veio do emissor e não foi alterado. Assinar o hash (32-64 bytes) é muito mais eficiente que assinar o documento inteiro.
- Protocolo IPSec (AH/ESP): Utiliza hashes como um "selo de garantia" para assegurar que o conteúdo que chega ao destino está em total conformidade com a origem. No modo de transporte do IPSec, as camadas superiores são fixadas pelo processo de hash para impedir modificações.
- Transferência Segura de Arquivos: Servidores gerenciados (SFTP, FTPS e HTTPS) utilizam funções hash para que o destinatário valide se o arquivo foi corretamente transmitido e gravado.
- Cofres de Senhas (HSM): Hardwares de segurança utilizam algoritmos de hash para proteger e gerenciar chaves criptográficas em ambientes de missão crítica.
- Verificação de Backups: É uma prática recomendada para validar a integridade de arquivos armazenados localmente ou em cópias de segurança (ZFS usa SHA-256 nos merkle trees do filesystem).
5. HMAC (Hash-based Message Authentication Code)
Um hash puro não garante autenticidade — qualquer um pode computar H(m). Para autenticar mensagens, usa-se o HMAC (RFC 2104, FIPS 198), que combina uma chave secreta K com a função hash:
HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m))
Onde ipad = 0x36 e opad = 0x5C repetidos. O HMAC é a base da integridade autenticada em TLS 1.2, IPSec (HMAC-SHA-256), SSH e JWT (HS256).
6. Armazenamento de Senhas
Senhas nunca devem ser armazenadas como hash simples — ataques com rainbow tables e GPU crackeiam MD5/SHA-256 de senhas comuns em segundos. As funções modernas aplicam:
- Salt: Valor aleatório único por usuário concatenado à senha (previne rainbow tables).
- Pepper: Segredo global armazenado à parte (protege DB vazado sem o pepper).
- Custo computacional: Algoritmos lentos deliberadamente, com fator de trabalho configurável.
| Algoritmo | Tipo | Recomendação |
|---|---|---|
| bcrypt | Adaptativo (custo 2work) | Mínimo custo 12 hoje |
| scrypt | Memória-difícil | Resistente a ASIC |
| Argon2id | Memória + CPU (vencedor PHC 2015) | Recomendado — OWASP 2024 |
| PBKDF2 | Iterativo | Compatível FIPS, mín. 600k iterações |
# Exemplo Python com Argon2id
from argon2 import PasswordHasher
ph = PasswordHasher(time_cost=3, memory_cost=65536, parallelism=4)
hash_salvo = ph.hash("senha_secreta")
ph.verify(hash_salvo, "senha_secreta") # True / raises VerifyMismatchError
7. Exemplos Práticos com OpenSSL
# Cálculo de SHA-256 de um arquivo
openssl dgst -sha256 arquivo.bin
# SHA256(arquivo.bin)= e3b0c4429...
# HMAC-SHA256 com chave
echo -n "mensagem" | openssl dgst -sha256 -hmac "chave_secreta"
# Comparação segura de hashes (proteção contra timing attacks)
cmp -s hash_esperado hash_calculado && echo "OK" || echo "FALHOU"
8. Hash em Blockchain
A função hash é o bloco construtivo central de blockchains como Bitcoin (SHA-256 duplo: SHA256(SHA256(header))) e Ethereum (Keccak-256, variante pré-padronizada do SHA-3). A integridade da cadeia deriva do encadeamento: cada bloco inclui o hash do anterior, criando uma estrutura Merkle tree onde alterar um bloco antigo invalida toda a sequência subsequente.
9. Resumo Técnico
| Atributo | MD5 | SHA-1 | SHA-256 | SHA-3-256 | BLAKE3 |
|---|---|---|---|---|---|
| Bits | 128 | 160 | 256 | 256 | 256+ |
| Blocos | 512 | 512 | 512 | 1600 | 1024 |
| Rounds | 64 | 80 | 64 | 24 | 7 |
| Seguro? | Não | Não | Sim | Sim | Sim |
| Velocidade relativa | 1,0 | 0,7 | 0,5 | 0,4 | 2,5+ |
10. Conclusão
As funções hash criptográficas são a base de quase todo mecanismo moderno de integridade e autenticidade. A escolha do algoritmo deve seguir o princípio da criptografia ágil: sistemas projetados para permitir troca rápida de algoritmo quando um é comprometido. Em 2024, a recomendação padrão é SHA-256 ou SHA-3 para integridade geral, HMAC-SHA-256 para autenticação de mensagens, e Argon2id para senhas. MD5 e SHA-1 devem ser evitados em qualquer novo projeto, sendo aceitáveis apenas em contextos não criptográficos (checksums de cache, deduplicação de blobs, etc.).