Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

04 - Funções Hash

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione 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 encontrar m tal que H(m) = h.
  • Resistência à segunda pré-imagem: Dada uma mensagem m1, é inviável encontrar m2 ≠ m1 tal que H(m1) = H(m2).
  • Resistência a colisões: É inviável encontrar qualquer par (m1, m2) com m1 ≠ m2 tal que H(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.).