Saltar para o conteúdo
Toolbrik
Voltar ao blog

MD5, SHA-1 e SHA-256: diferenças e qual usar em cada caso

3 min de leituraFerramenta relacionada: Hash de Texto

Se já descarregaste um programa e junto ao link aparecia uma cadeia como e3b0c44298fc1c149afbf4c8996fb924…, isso era um hash. Os hashes estão em todo o lado: no Git, nas assinaturas das APIs, nas chaves de cache, nas palavras-passe… Mas nem todos servem para o mesmo, e usar o errado pode abrir uma falha de segurança.

O que é uma função hash

Uma função hash recebe um texto ou ficheiro de qualquer tamanho e devolve uma impressão digital de tamanho fixo. Tem três propriedades essenciais:

  • Determinística: a mesma entrada produz sempre o mesmo hash.
  • Efeito avalanche: mudar um único carácter muda o hash por completo.
  • Unidirecional: a partir do hash não é possível reconstruir a entrada.

Por exemplo, o SHA-256 de olá e o de Olá não se parecem em nada, embora só mude uma maiúscula. Experimenta no gerador de hash: calcula MD5, SHA-1 e SHA-256 ao mesmo tempo, no teu browser.

As três funções, lado a lado

MD5 SHA-1 SHA-256
Tamanho 128 bits (32 caracteres hex) 160 bits (40 hex) 256 bits (64 hex)
Ano 1992 1995 2001
Colisões práticas Sim, desde 2004 Sim, desde 2017 Nenhuma conhecida
Seguro hoje? Não Não Sim

Uma colisão é encontrar duas entradas diferentes com o mesmo hash. No MD5 podem gerar-se em segundos num computador normal; no SHA-1, a Google e o CWI publicaram em 2017 a primeira colisão prática (o ataque «SHAttered»): dois PDF diferentes com o mesmo hash. Para o SHA-256 não se conhece nenhuma.

Para que serve cada um hoje

MD5: só contra acidentes, nunca contra atacantes

O MD5 continua útil para verificar que um ficheiro não se corrompeu por acidente (uma transferência incompleta, um disco com erros) ou para gerar chaves de cache e eliminar duplicados. É rápido e está disponível em todo o lado. O que não deves fazer é confiar no MD5 quando alguém pode manipular o ficheiro de propósito: um atacante consegue fabricar outro ficheiro com o mesmo hash.

SHA-1: em retirada

O Git usou o SHA-1 durante anos para identificar commits e está a migrar para o SHA-256. Os certificados TLS com SHA-1 deixaram de ser aceites há muito. Se o encontrares num sistema antigo, planeia a migração; não o escolhas para nada novo.

SHA-256: a opção por defeito

É o padrão atual para verificar transferências, assinar dados, calcular impressões digitais de certificados ou identificar conteúdo de forma única. Se precisas de «um hash» e não sabes qual, escolhe o SHA-256.

O erro mais grave: usá-los para palavras-passe

Nem o MD5, nem o SHA-1, nem sequer o SHA-256 são adequados para guardar palavras-passe. O problema não é poderem ser «decifrados», mas serem demasiado rápidos: uma placa gráfica atual calcula milhares de milhões de hashes por segundo, por isso testar todas as palavras-passe comuns contra uma base de dados roubada demora minutos. Além disso, sem «sal», dois utilizadores com a mesma palavra-passe têm o mesmo hash, e existem tabelas pré-calculadas (rainbow tables) com milhões de hashes de palavras-passe habituais.

Para palavras-passe usam-se funções lentas de propósito e com sal:

  • Argon2id (a recomendação atual da OWASP)
  • bcrypt
  • scrypt
  • PBKDF2 com muitas iterações, se precisares de cumprir FIPS

E a melhor defesa começa na própria palavra-passe: uma longa e aleatória, como as do gerador de senhas, resiste mesmo que o hash seja divulgado.

Hash não é cifra (nem Base64)

Três conceitos que se confundem muitas vezes:

  • Hash: unidirecional. Não há forma de voltar atrás.
  • Cifra: bidirecional com uma chave. Quem tiver a chave recupera o original.
  • Codificação (Base64): bidirecional sem chave. Qualquer pessoa a pode descodificar; só muda o formato. Podes comprová-lo com o codificador Base64.

Se queres confirmar que uma mensagem vem de quem diz vir (por exemplo, um webhook), um hash simples não chega: precisas de um HMAC, que combina o hash com uma chave secreta. O gerador HMAC calcula assinaturas HMAC-SHA256 para verificar essas integrações.

Resumo rápido

  • Verificar que uma transferência não está corrompida? SHA-256 (ou MD5 se for o único que o fornecedor publica).
  • Chave de cache ou eliminação de duplicados interna? MD5 ou SHA-256, tanto faz.
  • Assinar ou verificar mensagens entre sistemas? HMAC-SHA256.
  • Guardar palavras-passe? Argon2id ou bcrypt. Nunca MD5, SHA-1 ou SHA-256 simples.