Se a criptografia protege a confidencialidade, os hashes protegem a integridade — a segunda letra da tríade CIA. E há uma razão prática para você prestar atenção redobrada nesta aula: hashes são a base de como senhas são armazenadas, e portanto a base de todo o Bloco VII (ataques a senhas). Quando você "quebrar uma senha" mais adiante no curso, o que estará realmente atacando são hashes. Entender profundamente o que eles são — e o que não são — é pré-requisito para metade do trabalho ofensivo que vem pela frente.

Impressão digital de tamanho fixo

Um hash é o resultado de uma função que pega uma entrada de qualquer tamanho — uma palavra, um arquivo de 10 GB, o texto inteiro de um livro — e produz uma saída de tamanho fixo, uma espécie de impressão digital daquele dado. Funções de hash conhecidas incluem MD5, SHA-1 e a família SHA-2 (SHA-256). A propriedade que define um bom hash criptográfico, e que muda tudo, é ser unidirecional: é fácil calcular o hash a partir do dado, mas é inviável fazer o caminho inverso — a partir do hash, reconstruir o dado original. É uma rua de mão única. Isso distingue hash de criptografia de forma fundamental: criptografia é reversível (com a chave, você recupera o original); hash não é. Um erro comum de iniciante é dizer que uma senha foi "criptografada" quando na verdade foi "hasheada" — e a diferença é enorme.

Determinismo, avalanche e resistência a colisão

As propriedades que tornam um hash útil para segurança são três. Determinismo: a mesma entrada sempre gera o mesmo hash (senão seria inútil para verificação). Efeito avalanche: uma mudança minúscula na entrada — um único bit — produz um hash completamente diferente, sem qualquer semelhança com o anterior. E resistência a colisão: deve ser inviável encontrar duas entradas diferentes que gerem o mesmo hash. Essa última propriedade é crucial, e é onde algoritmos envelhecem: MD5 e SHA-1 estão quebrados justamente porque pesquisadores encontraram formas de gerar colisões, o que os torna inadequados para usos que dependem de integridade. Encontrar MD5 ou SHA-1 em uso para fins de segurança é, para o pentester, um achado que vai para o relatório.

Verificar que o arquivo chegou íntegro

O uso mais direto de hashes é verificação de integridade. Quando você baixa um programa e o site publica o hash SHA-256 do arquivo, você pode calcular o hash do que baixou e comparar: se baterem, o arquivo chegou íntegro; se diferirem, foi corrompido ou adulterado. Na prática:

sha256sum arquivo.iso        # calcula o hash SHA-256 do arquivo
md5sum arquivo.iso           # calcula o MD5 (mais rápido, mas inseguro para segurança)

Você compara a saída com o valor publicado. Lembra da aula Montando seu laboratório: o campo de treino legal, quando insisti em baixar o Kali do site oficial? Verificar o hash da imagem é exatamente como você confirma que não recebeu uma versão adulterada.

Guardar o hash, nunca a senha

Agora o uso que mais importa para o curso: armazenamento de senhas. Sistemas bem projetados nunca guardam sua senha em texto puro — guardam o hash dela. Quando você faz login, o sistema calcula o hash do que você digitou e compara com o hash armazenado; se batem, você entra, e o sistema nunca precisou conhecer sua senha real. A beleza disso é que, se o banco de dados vaza, o atacante obtém hashes, não senhas. Mas — e aqui está o cerne do Bloco VII — hashes de senha podem ser atacados. Como o hash é determinístico, o atacante pega uma lista gigante de senhas prováveis (uma wordlist), calcula o hash de cada uma, e compara com os hashes vazados. Quando um bate, ele descobriu a senha. Isso é o cracking de senhas, e não "reverte" o hash (impossível) — ele adivinha e confere.

Salt e o algoritmo lento de propósito

É por isso que existem defesas específicas para hash de senha, que você precisa conhecer dos dois lados. O salt (sal) é um valor aleatório único, adicionado a cada senha antes de gerar o hash. Ele garante que duas pessoas com a mesma senha tenham hashes diferentes, e — crucialmente — derruba os ataques de rainbow table (tabelas pré-computadas de hashes, aula Rainbow tables e a defesa em profundidade das senhas), porque o atacante teria de recomputar tudo para cada salt distinto. Além do salt, senhas devem usar funções de hash deliberadamente lentas — como bcrypt, scrypt ou Argon2 —, projetadas para serem custosas de calcular, tornando o cracking em massa impraticável. Usar SHA-256 "cru" para senhas é um erro, porque ele é rápido demais, o que ajuda o atacante a testar bilhões de tentativas por segundo. Perceba a inversão: para verificação de integridade queremos hash rápido; para senhas queremos hash lento.

Assinatura: hash cifrado com a chave privada

Finalmente, hashes se combinam com a criptografia assimétrica para formar a assinatura digital, que garante autenticidade e integridade de uma vez. Funciona assim: para assinar um documento, você calcula o hash dele e cifra esse hash com sua chave privada — isso é a assinatura. Qualquer um pode verificar: decifra a assinatura com sua chave pública (obtendo o hash original), calcula o hash do documento recebido, e compara. Se batem, prova-se duas coisas simultaneamente: que foi você quem assinou (só sua chave privada geraria aquilo — autenticidade) e que o documento não foi alterado (senão o hash não bateria — integridade). É esse mecanismo que valida certificados na PKI (aula Criptografia assimétrica e PKI: dois cadeados e uma cadeia de confiança), atualizações de software, e transações. A união de hash + assimétrica é uma das construções mais importantes da segurança prática.

Fontes e leituras recomendadas

Exercícios

  1. Qual a diferença fundamental entre hash e criptografia quanto à reversibilidade?

    ✓ Resposta:

    A criptografia é reversível — com a chave, recupera-se o dado original. O hash é unidirecional: calcula-se facilmente o hash a partir do dado, mas é inviável reconstruir o dado a partir do hash.

  2. Explique o "efeito avalanche" e a "resistência a colisão". Por que MD5 e SHA-1 são considerados inadequados para segurança?

    ✓ Resposta:

    Efeito avalanche: uma mudança mínima na entrada (até um bit) gera um hash completamente diferente. Resistência a colisão: deve ser inviável achar duas entradas distintas com o mesmo hash. MD5 e SHA-1 são inadequados porque foram descobertas formas práticas de gerar colisões neles.

  3. Como um sistema verifica sua senha no login sem nunca armazená-la em texto puro?

    ✓ Resposta:

    O sistema armazena o hash da senha. No login, calcula o hash do que foi digitado e o compara com o hash armazenado; se coincidem, o acesso é concedido, sem que a senha real precise ser guardada.

  4. O cracking de senhas "reverte" o hash? Explique o que ele realmente faz e por que o determinismo do hash o torna possível.

    ✓ Resposta:

    Não reverte. Ele calcula o hash de muitas senhas prováveis (uma wordlist) e compara cada resultado com o hash-alvo; quando um bate, a senha foi descoberta. O determinismo (mesma entrada → mesmo hash) é o que permite essa comparação por adivinhação.

  5. O que é o salt, qual ataque ele neutraliza, e por que funções como bcrypt são preferíveis a SHA-256 para senhas?

    ✓ Resposta:

    O salt é um valor aleatório único adicionado a cada senha antes do hash, fazendo senhas iguais gerarem hashes diferentes; ele neutraliza ataques de rainbow table. Funções como bcrypt são preferíveis porque são deliberadamente lentas, dificultando o cracking em massa, enquanto o SHA-256 é rápido demais e favorece o atacante.