Aula 06 – Funções de Hash e Integridade #️⃣
Como saber se um arquivo não foi alterado? Como armazenar senhas sem guardar a senha em si? A resposta para as duas perguntas é a mesma: funções de hash.
🧐 O que é uma Função de Hash?
Uma função de hash pega uma entrada de qualquer tamanho e produz uma saída de tamanho fixo — chamada de "hash" ou "digest". Ela tem três propriedades essenciais:
- Determinística: a mesma entrada sempre gera a mesma saída.
- Unidirecional: é inviável reverter o hash para descobrir a entrada original.
- Efeito avalanche: mudar 1 bit da entrada muda completamente a saída.
graph LR
A["'senha123'"] --> H["Função de Hash SHA-256"]
H --> B["ef92b778...e08e (64 caracteres)"]
C["'senha124'"] --> H2["Função de Hash SHA-256"]
H2 --> D["a1c3f902...9d1b (completamente diferente!)"] Hash não é criptografia
Diferente da cifragem, hash não tem chave e não é reversível por design. Não existe "dehash" — só é possível tentar adivinhar a entrada testando valores (força bruta ou tabelas pré-computadas).
📊 Principais Algoritmos de Hash
| Algoritmo | Tamanho da saída | Status |
|---|---|---|
| MD5 | 128 bits | ❌ Quebrado, colisões conhecidas — não usar |
| SHA-1 | 160 bits | ❌ Quebrado, aposentado desde 2017 |
| SHA-256 | 256 bits | ✅ Padrão atual, seguro |
| SHA-3 | 224–512 bits | ✅ Alternativa moderna, design diferente do SHA-2 |
MD5 e SHA-1 ainda aparecem em sistemas antigos
Uma colisão acontece quando duas entradas diferentes produzem o mesmo hash. Para MD5 e SHA-1, já existem colisões práticas e documentadas — por isso ambos estão banidos de uso em segurança.
✅ Verificação de Integridade
O uso mais comum de hash no dia a dia: garantir que um arquivo baixado não foi corrompido ou adulterado.
🔐 Hash com Chave: HMAC
O HMAC (Hash-based Message Authentication Code) combina uma função de hash com uma chave secreta, garantindo não só integridade, mas também autenticidade — a prova de que a mensagem veio de quem tem a chave.
- Hash simples: prova que a mensagem não mudou.
- HMAC: prova que a mensagem não mudou e veio de quem possui o segredo compartilhado.
graph TD
A["Mensagem + Chave Secreta"] --> H["HMAC-SHA256"]
H --> B["Codigo de Autenticacao"]
B --> C{"Destinatario recalcula com a mesma chave"}
C -- "Bate" --> D["Mensagem autentica e integra"]
C -- "Nao bate" --> E["Mensagem alterada ou remetente falso"] 📝 Exercícios de Fixação
- Básico: Explique a diferença entre hash e criptografia (cifragem).
- Básico: Por que MD5 não deve mais ser usado para hash de senhas?
- Intermediário: O que é o "efeito avalanche" e por que ele é uma propriedade desejável em um hash?
- Intermediário: Qual a diferença entre um hash simples (SHA-256) e um HMAC?
- Desafio: Pesquise o que é um "ataque de aniversário" (birthday attack) contra funções de hash.
🚀 Mini-Projeto: Verificador de Integridade de Arquivos
Objetivo: Criar um script que calcula e compara hashes SHA-256 de arquivos.
- Escolha uma linguagem (Python é uma ótima opção com
hashlib). - Escreva uma função que recebe o caminho de um arquivo e retorna seu hash SHA-256.
- Calcule o hash de um arquivo, modifique 1 caractere dentro dele, e calcule o hash de novo.
- Confirme visualmente que os dois hashes são completamente diferentes (efeito avalanche).