Todos os artigos
74 artigos · atualizado semanalmente Veja nossas Ferramentas
Todos os artigos
Dicas

Hashing para quem nunca leu o RFC: MD5, SHA-1, SHA-256

Cada algoritmo, suas falhas históricas, e quando ainda faz sentido usar — sem entrar em matemática pesada.

COVER · Dicas

Fui revisar o código de uma API legada e encontrei senhas sendo guardadas com MD5. Em 2024. O dev original provavelmente achou que "tá encriptado" — e aqui está o problema: MD5 não encripta nada, e mesmo para hashing de dados não-sensíveis, a escolha do algoritmo importa muito mais do que a maioria das pessoas imagina.

Este post é o que você precisa saber sobre os três algoritmos mais comuns, sem entrar em teoria de grupos finitos.

O que é hashing (de verdade)

Uma função de hash é uma função de mão única: dado um input, produz sempre o mesmo output de tamanho fixo. Não dá pra reverter o output para chegar ao input original — pelo menos não diretamente.

O que diferencia um algoritmo de hash de outro é basicamente: velocidade, tamanho do output, e resistência a colisões (dois inputs diferentes gerando o mesmo output).

MD5

Output: 128 bits (32 chars hex).

Criado em 1992. Quebrado por colisão em 2004. Em 2008, pesquisadores geraram um certificado CA falso explorando colisões de MD5. Em 2012, o malware Flame usou a mesma técnica.

Nunca use MD5 para:

  • Hashing de senhas (é rápido demais — facilita brute-force)
  • Verificação de integridade de segurança (colisões são computacionalmente viáveis)
  • Assinaturas digitais

Ainda faz sentido para:

  • Checksums de arquivos em contextos onde velocidade importa e segurança não é crítica
  • IDs de deduplicação de conteúdo (verificar se um arquivo já existe no cache)
  • Fingerprinting não-criptográfico
echo -n "hello" | md5sum
# 5d41402abc4b2a76b9719d911017c592

SHA-1

Output: 160 bits (40 chars hex).

Desenvolvido pela NSA, publicado em 1995. Colisão prática demonstrada pelo Google em 2017 (o ataque SHAttered). Browsers pararam de aceitar certificados TLS com SHA-1 em 2017.

Nunca use SHA-1 para:

  • Certificados TLS/SSL
  • Assinaturas de código
  • Qualquer contexto de segurança moderno

Ainda aparece em:

  • Git (usa SHA-1 para identificar commits — está migrando para SHA-256)
  • Alguns sistemas legados de verificação de integridade não-críticos

O Git usa SHA-1 como identificador, não como garantia de segurança. A resistência a colisões importa menos quando o adversário não controla o conteúdo dos commits.

SHA-256

Output: 256 bits (64 chars hex). Parte da família SHA-2.

Publicado em 2001. Sem colisão conhecida. Amplamente usado em TLS, HTTPS, Bitcoin, JWT (algoritmo HS256), e verificação de integridade de software.

Use SHA-256 para:

  • Verificação de integridade de arquivos críticos
  • HMACs (assinaturas de mensagem com chave secreta)
  • Checksums de segurança em geral

Não use SHA-256 para:

  • Hashing de senhas — ainda é rápido demais. Use bcrypt, scrypt ou Argon2 para senhas
const hash = await crypto.subtle.digest(
  'SHA-256',
  new TextEncoder().encode('hello')
);
// ArrayBuffer → hex string
const hex = [...new Uint8Array(hash)].map(b => b.toString(16).padStart(2, '0')).join('');

Para senhas: nenhum dos três

MD5, SHA-1 e SHA-256 são algoritmos rápidos por design. Para senhas, você quer o oposto: um algoritmo deliberadamente lento que torna brute-force computacionalmente caro.

Use bcrypt (fator de custo >= 12), scrypt (N >= 16384), ou Argon2id (o mais moderno). Esses algoritmos são ajustáveis — você aumenta o custo computacional conforme o hardware fica mais barato.

Testando na prática

Para gerar e comparar hashes de qualquer texto com MD5, SHA-1, SHA-256 e outros, o Gerador de Hash do Quick Tools processa tudo no navegador — sem enviar nada para servidor.

Como escolher o hash certo

A pergunta mais importante não é qual algoritmo é mais famoso, mas qual problema você quer resolver. Para integridade de arquivo, SHA-256 costuma ser uma escolha segura e amplamente suportada. Para checksums rápidos sem objetivo de segurança, algoritmos como CRC podem ser suficientes. Para senhas, hash genérico não basta: use algoritmos com custo configurável, como Argon2, bcrypt ou scrypt.

Nunca use MD5 ou SHA-1 para segurança. Eles ainda aparecem em sistemas legados e podem servir para identificar duplicados sem risco crítico, mas não devem proteger autenticação, assinatura ou integridade contra atacante ativo.

Checklist antes de publicar

Confirme se o hash precisa de salt, se precisa ser reproduzível em outro sistema e se o formato de saída deve ser hex ou Base64. Documente também o encoding de entrada. A string ação pode gerar resultados diferentes se um sistema usar UTF-8 e outro tratar bytes de outra forma.

Use o Hash Generator para comparar algoritmos, testar entradas conhecidas e registrar exemplos no README ou na documentação da API. Exemplos reais evitam regressões quando outra linguagem ou biblioteca entra no fluxo.

HT
Autor
Hugo Tanaka
Japonês-brasileiro de segunda geração, cresceu vendo o pai debugar planilhas de logística em BASIC. Desenvolvedor full-stack com foco em tooling e DX — o papel que finalmente uniu código, escrita e obsessão por produtividade num lugar só. Escreve para quem já sabe programar e quer resolver um problema agora.
Ver perfil