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

O MD5 e o SHA-1 continuam a ser muito utilizados em bases de código de produção, apesar de estarem criptograficamente quebrados há décadas. A MD5 é considerada insegura desde 2004 e a SHA-1 desde 2017. No entanto, os programadores continuam a utilizá-los para hashing de palavras-passe, assinaturas digitais e verificação de integridade, onde os ataques de colisão e os ataques de pré-imagem representam verdadeiros riscos de segurança. O custo computacional para gerar colisões MD5 é agora trivial, e os ataques de colisão SHA-1 são práticos com recursos de computação em nuvem.

Porque é importante

Implicações de segurança: O MD5 e o SHA-1 são vulneráveis a ataques de colisão em que duas entradas diferentes produzem o mesmo resultado de hash. Os atacantes exploram este facto para criar ficheiros maliciosos com o mesmo hash que os legítimos, contornando as verificações de integridade. Para o armazenamento de palavras-passe, estes algoritmos são catastroficamente fracos porque são rápidos, tornando triviais os ataques de força bruta e de tabela arco-íris. Uma GPU moderna pode calcular milhares de milhões de hashes MD5 por segundo, o que significa que uma palavra-passe de 8 caracteres pode ser decifrada em horas.

Conformidade e risco legal: Normas de segurança como PCI DSS, HIPAA e SOC 2 proíbem explicitamente MD5 e SHA-1 para fins criptográficos. A sua utilização em ambientes regulamentados cria falhas de auditoria e responsabilidade legal. Os principais navegadores avisam agora os utilizadores quando encontram certificados SHA-1, prejudicando a confiança e bloqueando potencialmente o acesso aos seus serviços.

Manutenção do código: Quando são descobertos algoritmos de hashing desactualizados no código, estes requerem uma correção imediata. Isto cria uma dívida técnica que se agrava com o 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 dispendiosas e correcções de segurança de emergência.

Expansão da superfície de ataque: Os algoritmos de hashing fracos criam múltiplos vectores de ataque. As bases de dados de palavras-passe tornam-se vulneráveis à quebra offline. As assinaturas digitais podem ser forjadas. Os sistemas de integridade de ficheiros podem ser contornados. Cada utilização de MD5 ou SHA-1 é um potencial incidente de segurança à espera de 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;
}

Porque é que não é seguro: O MD5 para hashing de palavras-passe não oferece segurança contra ferramentas de cracking modernas. O SHA-1 para a integridade dos ficheiros pode ser derrotado por ataques de colisão, permitindo que ficheiros maliciosos passem na verificação. Ambos os algoritmos são computacionalmente baratos para a força bruta.

Conformidade:

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;
}

Porque é que é seguro: O PBKDF2 com SHA-256 e uma elevada contagem de iterações (310.000) torna a quebra de palavras-passe exponencialmente mais lenta. O SHA-256 para integridade de ficheiros é resistente a colisões, sem ataques práticos conhecidos. Ambos os algoritmos cumprem as normas de segurança actuais e os requisitos de conformidade.

Conclusão

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

FAQs

Tem perguntas?

Quando é que é aceitável utilizar MD5 ou SHA-1?

Apenas em contextos não relacionados com a segurança em que não é necessária resistência à colisão: chaves de cache, ETags para distribuição de conteúdos não sensíveis ou somas de verificação para detetar corrupção acidental de dados (não adulteração maliciosa). Mesmo nesse caso, documentar a razão pela qual o algoritmo mais fraco é aceitável. Para qualquer autenticação, autorização, verificação de integridade ou assinatura criptográfica, estes algoritmos nunca são aceitáveis.

O que devo utilizar em vez de MD5 e SHA-1 para o hashing de palavras-passe?

Use bcrypt, scrypt ou Argon2. Estas são funções de hashing de palavra-passe criadas propositadamente que incluem salga e são intencionalmente lentas para resistir a ataques de força bruta. O Argon2 é o padrão moderno e venceu a Competição de Hashing de Senha em 2015. Evite usar funções de hash de uso geral, como SHA-256, diretamente para senhas, pois elas são muito rápidas. Se tiver que usar SHA-256, envolva-o em PBKDF2 com pelo menos 310.000 iterações.

E quanto ao SHA-256 ou SHA-3 para a integridade dos ficheiros?

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

Como faço para migrar hashes MD5/SHA-1 existentes sem quebrar tudo?

Para as palavras-passe, implemente o hashing duplo durante a migração: mantenha temporariamente os hashes antigos, mas quando os utilizadores iniciarem sessão com êxito, volte a fazer o hash da palavra-passe com o novo algoritmo e actualize a base de dados. Para os tokens da API ou hashes de integridade, altere o 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 utilizadores restantes a reiniciarem após essa data.

Existem diferenças de desempenho entre estes algoritmos?

Sim, mas não de uma forma que importe para a segurança. O MD5 é mais rápido do que o SHA-256, o que é exatamente o problema para o hashing de palavras-passe, em que a lentidão é uma caraterística. Para a integridade dos ficheiros, a diferença de desempenho é insignificante no hardware moderno. O SHA-256 adiciona microssegundos a operações que normalmente envolvem E/S de disco medidas em milissegundos. O benefício de segurança supera amplamente qualquer custo de desempenho.

E quanto ao HMAC com MD5 ou SHA-1?

O HMAC-MD5 e o HMAC-SHA-1 são mais resistentes a ataques do que as funções de hash de base porque o HMAC fornece propriedades de segurança adicionais. No entanto, elas ainda estão obsoletas na maioria dos padrões de segurança. Em vez disso, use HMAC-SHA-256. A diferença de desempenho é mínima e evita problemas de conformidade. O HMAC-SHA-256 é aprovado para uso federal (FIPS 198-1) e atende a todos os principais padrões de segurança.

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

Procura por padrões comuns: md5, sha1, MessageDigest.getInstance("MD5"), hashlib.md5(), crypto.createHash('md5'). Verifique as configurações de dependência para definições SSL/TLS utilizando certificados SHA-1. Reveja as integrações de API com terceiros que possam exigir estes algoritmos. As ferramentas automatizadas de análise de código podem detetar estes padrões em várias línguas e assinalá-los para revisão.

Obter segurança gratuitamente

Proteja seu código, nuvem e tempo de execução em um sistema central.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados do scan em 32secs.