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.
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.
- 01 diff antes de abrir PR: o hábito que reduz comentários de revisão Ler o próprio diff antes de abrir um PR muda o que você vê no código. Como e por que esse hábito reduz ciclos de revisão e melhora a qualidade dos PRs.
- 02 `P@ssw0rd1` passa na sua validação. Esse é o problema. O que o NIST mudou em 2024 sobre senhas: comprimento bate complexidade, leet speak está no rockyou.txt e rotação obrigatória enfraquece senhas.