Aikido

Pare de Usar MD5 e SHA-1: Hashing Moderno para Segurança

Segurança

Regra
Não utilizar desatualizado hashing ultrapassados a menos que contextualmente 
justificado. utilizar desatualizados hashing desactualizados (MD5, SHA-1)
em qualquer sensíveis à segurança sensíveis à segurança. Estes são criptograficamente
quebrados, fáceis de força bruta, e prejudicar sistema manutenção do sistema.

Idiomas suportados: 45+

Introdução

MD5 e SHA-1 permanecem amplamente utilizados em bases de código em produção, apesar de estarem criptograficamente comprometidos há décadas. MD5 é considerado inseguro desde 2004, SHA-1 desde 2017. No entanto, desenvolvedores continuam a usá-los para hashing de senhas, assinaturas digitais e verificação de integridade, onde ataques de colisão e ataques de pré-imagem representam riscos reais de segurança. O custo computacional para gerar colisões MD5 é agora trivial, e ataques de colisão SHA-1 são práticos com recursos de computação em Cloud.

Por que isso importa

Implicações de segurança: MD5 e SHA-1 são vulneráveis a ataques de colisão, onde duas entradas diferentes produzem o mesmo hash de saída. Atacantes exploram isso para criar arquivos maliciosos com o mesmo hash de arquivos legítimos, ignorando verificações de integridade. Para armazenamento de senhas, esses algoritmos são catastroficamente fracos porque são rápidos, tornando ataques de força bruta e de tabela arco-íris triviais. Uma GPU moderna pode computar bilhões de hashes MD5 por segundo, o que significa que uma senha de 8 caracteres pode ser quebrada em horas.

Risco de conformidade e legal: Padrões de segurança como PCI DSS, HIPAA e SOC 2 proíbem explicitamente MD5 e SHA-1 para fins criptográficos. Usá-los em ambientes regulamentados gera falhas de auditoria e responsabilidade legal. Os principais navegadores agora alertam os usuários ao encontrar certificados SHA-1, prejudicando a confiança e potencialmente bloqueando o acesso aos seus serviços.

Manutenibilidade do código: Quando algoritmos de hash desatualizados são descobertos no código, eles exigem remediação imediata. Isso cria dívida técnica que se acumula ao longo do tempo porque a migração se torna mais difícil à medida que mais dados se acumulam. A adoção precoce de algoritmos seguros evita migrações futuras caras e patches de segurança de emergência.

Expansão da superfície de ataque: Algoritmos de hashing fracos criam múltiplos vetores de ataque. Bancos de dados de senhas tornam-se vulneráveis a cracking offline. Assinaturas digitais podem ser forjadas. Sistemas de integridade de arquivos podem ser contornados. Cada uso de MD5 ou SHA-1 é um incidente de segurança potencial esperando para acontecer.

Exemplos de código

❌ Não-conforme:

const crypto = require('crypto');

function hashPassword(password) {
  return crypto.createHash('md5')
    .update(password)
    .digest('hex');
}

function verifyFileIntegrity(fileContent, expectedHash) {
  const hash = crypto.createHash('sha1')
    .update(fileContent)
    .digest('hex');
  return hash === expectedHash;
}

Por que é inseguro: MD5 para hash de senhas não oferece segurança contra ferramentas de quebra modernas. SHA-1 para integridade de arquivos pode ser superado com ataques de colisão, permitindo que arquivos maliciosos passem pela verificação. Ambos os algoritmos são computacionalmente baratos para ataques de força bruta.

✅ Compatível:

const crypto = require('crypto');

async function hashPassword(password) {
  const salt = crypto.randomBytes(16);
  return new Promise((resolve, reject) => {
    crypto.pbkdf2(password, salt, 310000, 32, 'sha256', (err, key) => {
      if (err) reject(err);
      resolve({ salt: salt.toString('hex'), hash: key.toString('hex') });
    });
  });
}

function verifyFileIntegrity(fileContent, expectedHash) {
  const hash = crypto.createHash('sha256')
    .update(fileContent)
    .digest('hex');
  return hash === expectedHash;
}

Por que é seguro: PBKDF2 com SHA-256 e alta contagem de iterações (310.000) torna a quebra de senhas exponencialmente mais lenta. SHA-256 para integridade de arquivos é resistente a colisões, sem ataques práticos conhecidos. Ambos os algoritmos atendem aos padrões de segurança e requisitos de conformidade atuais.

Conclusão

MD5 e SHA-1 não têm lugar em código sensível à segurança. Suas vulnerabilidades são bem documentadas, exploits estão publicamente disponíveis e alternativas seguras existem em todas as principais linguagens. O caminho de migração é claro: use bcrypt, scrypt ou Argon2 para senhas, e SHA-256 ou SHA-3 para verificação de integridade. Cada dia que esses algoritmos fracos permanecem em produção aumenta sua superfície de ataque.

FAQs

Dúvidas?

Quando é aceitável usar MD5 ou SHA-1?

Apenas em contextos não relacionados à segurança onde a resistência a colisões não é necessária: chaves de cache, ETags para distribuição de conteúdo não sensível, ou checksums para detecção de corrupção acidental de dados (não adulteração maliciosa). Mesmo assim, documente por que o algoritmo mais fraco é aceitável. Para qualquer autenticação, autorização, verificação de integridade ou assinatura criptográfica, esses algoritmos nunca são aceitáveis.

O que devo usar em vez de MD5 e SHA-1 para o hashing de senhas?

Utilize bcrypt, scrypt ou Argon2. Estas são funções de hash de senha projetadas especificamente que incluem salting e são intencionalmente lentas para resistir a ataques de força bruta. Argon2 é o padrão moderno e venceu a Competição de Hashing de Senhas em 2015. Evite usar funções de hash de propósito geral como SHA-256 diretamente para senhas, pois são muito rápidas. Se você precisar usar SHA-256, envolva-o em PBKDF2 com pelo menos 310.000 iterações.

E quanto ao SHA-256 ou SHA-3 para integridade de arquivos?

SHA-256 é atualmente seguro e amplamente suportado. SHA-3 (Keccak) oferece garantias de segurança ainda mais robustas com uma estrutura interna diferente, proporcionando defesa em profundidade caso o SHA-2 seja comprometido. Para a maioria das aplicações, SHA-256 é suficiente. Use SHA-512 para uma margem de segurança extra ou ao trabalhar com conjuntos de dados muito grandes. Ambos são resistentes a ataques de colisão e pré-imagem conhecidos.

Como migrar hashes MD5/SHA-1 existentes sem quebrar tudo?

Para senhas, implemente o dual-hashing durante a migração: mantenha os hashes antigos temporariamente, mas quando os usuários fizerem login com sucesso, faça o re-hashing de suas senhas com o novo algoritmo e atualize o banco de dados. Para tokens de API ou hashes de integridade, versionar seu formato de hash (por exemplo, md5:abc123 vs sha256:def456) para que os sistemas possam lidar com ambos durante a transição. Defina um prazo de migração e force os usuários restantes a redefinir após essa data.

Existem diferenças de desempenho entre esses algoritmos?

Sim, mas não de maneiras que importem para a segurança. MD5 é mais rápido que SHA-256, o que é exatamente o problema para hashing de senhas, onde a lentidão é uma característica. Para integridade de arquivos, a diferença de desempenho é insignificante em hardware moderno. SHA-256 adiciona microssegundos a operações que tipicamente envolvem I/O de disco medido em milissegundos. O benefício de segurança supera em muito qualquer custo de desempenho.

E quanto ao HMAC com MD5 ou SHA-1?

HMAC-MD5 e HMAC-SHA-1 são mais resistentes a ataques do que as funções hash base, pois o HMAC oferece propriedades de segurança adicionais. No entanto, eles ainda são descontinuados na maioria dos padrões de segurança. Use HMAC-SHA-256 em vez disso. A diferença de desempenho é mínima e você evita problemas de conformidade. HMAC-SHA-256 é aprovado para uso federal (FIPS 198-1) e atende a todos os principais padrões de segurança.

Como encontrar todas as instâncias de MD5/SHA-1 na minha base de código?

Procure por padrões comuns: md5, sha1, MessageDigest.getInstance("MD5"), hashlib.md5(), crypto.createHash('md5'). Verifique as configurações de dependência para configurações SSL/TLS usando certificados SHA-1. Revise as integrações de API com terceiros que possam exigir esses algoritmos. Ferramentas automatizadas de varredura de código podem detectar esses padrões em várias linguagens e sinalizá-los para revisão.

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.