Pular para conteúdo

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:

  1. Determinística: a mesma entrada sempre gera a mesma saída.
  2. Unidirecional: é inviável reverter o hash para descobrir a entrada original.
  3. 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.

$ # Calculando o hash SHA-256 de um arquivo baixado $ certutil -hashfile instalador.exe SHA256 $ SHA256 hash of instalador.exe: $ ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94 $ $ # Comparando com o hash publicado pelo site oficial $ # Se os dois hashes baterem, o arquivo nao foi alterado

🔐 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

  1. Básico: Explique a diferença entre hash e criptografia (cifragem).
  2. Básico: Por que MD5 não deve mais ser usado para hash de senhas?
  3. Intermediário: O que é o "efeito avalanche" e por que ele é uma propriedade desejável em um hash?
  4. Intermediário: Qual a diferença entre um hash simples (SHA-256) e um HMAC?
  5. 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.

  1. Escolha uma linguagem (Python é uma ótima opção com hashlib).
  2. Escreva uma função que recebe o caminho de um arquivo e retorna seu hash SHA-256.
  3. Calcule o hash de um arquivo, modifique 1 caractere dentro dele, e calcule o hash de novo.
  4. Confirme visualmente que os dois hashes são completamente diferentes (efeito avalanche).

Ir para Aula 07