Ir para o conteúdo
Toova
Todas as Ferramentas

MD5 vs SHA-256 — Por Que Você Deve Parar de Usar MD5

Toova

O MD5 está em todo lugar. Vem em todas as linguagens de programação, em todos os bancos de dados, em todos os SDKs de provedores de nuvem. Os devs o usam por hábito — é rápido, produz uma string hex de 32 caracteres limpa e a API tem duas linhas de código. O problema: o MD5 tem sido criptograficamente comprometido desde 2004, e os ataques só ficaram mais rápidos e baratos desde então.

Isso não é teórico. Um ciberataque em 2012 contra infraestrutura iraniana — o malware Flame — forjou um certificado de assinatura de código da Microsoft explorando uma colisão MD5. A mesma técnica que criptógrafos acadêmicos demonstraram em um artigo se tornou uma arma usada em espionagem geopolítica. O MD5 não está levemente enfraquecido; ele está fundamentalmente comprometido para qualquer aplicação onde um adversário pode escolher as entradas.

O SHA-256, parte da família SHA-2 padronizada pelo NIST, não tem ataques de colisão conhecidos e permanece o padrão para integridade criptográfica em 2026. Este artigo explica exatamente o que a diferença significa, quando (raramente) o MD5 ainda é aceitável e como migrar com segurança. Você pode computar ambos os hashes instantaneamente com as ferramentas MD5 hash do Toova e SHA-256 hash do Toova.

Como Funcionam as Funções de Hash

Uma função de hash criptográfica recebe uma entrada de qualquer comprimento e produz uma saída de comprimento fixo (o digest) com estas propriedades:

  • Determinística: a mesma entrada sempre produz a mesma saída.
  • Efeito avalanche: a mudança de um único bit na entrada muda completamente a saída.
  • Resistência a pré-imagem: dado um hash, é computacionalmente inviável encontrar a entrada.
  • Resistência a colisão: é computacionalmente inviável encontrar duas entradas diferentes que produzem o mesmo hash.

O efeito avalanche é por que tanto o MD5 quanto o SHA-256 parecem similares à primeira vista:

MD5("The quick brown fox jumps over the lazy dog")
= 9e107d9d372bb6826bd81d3542a419d6

MD5("The quick brown fox jumps over the lazy cog")
= 1055d3e698d289f2af8663725127bd4b
SHA-256("The quick brown fox jumps over the lazy dog")
= d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592

SHA-256("The quick brown fox jumps over the lazy cog")
= e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be

Um caractere mudou na entrada ("dog" → "cog"), mas a saída é completamente diferente. Essa propriedade vale para ambos os algoritmos. A diferença está no que acontece quando um atacante tenta encontrar uma colisão intencionalmente.

MD5 — Uma Linha do Tempo de Falhas (1996–2025)

O MD5 foi projetado por Ron Rivest em 1991 como substituto do MD4. Em 1996, Hans Dobbertin encontrou colisões na função de compressão do MD5 — não no algoritmo completo, mas um sinal de alerta de que o design era frágil. A comunidade de segurança começou a recomendar a migração para o SHA-1. A maioria dos sistemas ignorou isso.

2004 — Colisões completas demonstradas

Em agosto de 2004, Xiaoyun Wang e Hongbo Yu apresentaram um ataque prático de colisão no MD5 na conferência CRYPTO. Eles conseguiram gerar duas mensagens de 1.024 bits diferentes com o mesmo hash MD5 em menos de uma hora em um cluster. A garantia fundamental do MD5 — resistência a colisão — estava quebrada.

O NIST imediatamente começou a descontinuar o MD5 para uso federal. A maioria das orientações do setor seguiu. O uso real do MD5 em sistemas de produção mal mudou.

2008 — Certificados CA desonestos

Um grupo de pesquisadores (Sotirov, Stevens e outros) demonstrou que podiam criar um certificado de Autoridade Certificadora desonesto que seria confiável por todos os browsers principais. O ataque explorou o fato de que várias autoridades certificadoras ainda estavam assinando certificados com MD5. Os pesquisadores geraram uma colisão entre uma requisição de certificado de aparência legítima e um certificado CA criado por eles — depois conseguiram que uma CA real assinasse o legítimo, produzindo uma assinatura que também era válida para o CA forjado.

Todos os browsers principais bloquearam imediatamente certificados assinados com MD5. A maioria das autoridades certificadoras parou de emiti-los. Uma lição importante: fraquezas criptográficas se tornam exploráveis no momento em que um atacante controla a entrada para a função de hash.

2012 — Malware Flame

O malware Flame de ciberespionagem, descoberto em 2012 e atribuído a atores estatais, forjou um certificado do Windows Update da Microsoft usando uma colisão MD5 de prefixo escolhido. O ataque foi mais sofisticado que a demonstração de 2008: os atacantes conseguiram criar um payload malicioso que colidia com um certificado legítimo da Microsoft em condições onde a infraestrutura de assinatura da Microsoft cooperaria sem saber.

O resultado: o Flame podia se distribuir pelo Windows Update como se fosse uma atualização legítima da Microsoft, com uma assinatura válida da Microsoft. Centenas de milhares de máquinas Windows no Irã, Líbano, Síria e Sudão foram infectadas. Esta foi uma exploração real de ataques de colisão MD5 em escala de estado-nação. Veja o artigo da Wikipédia sobre o malware Flame para o histórico completo.

2019–2025 — HashClash e colisões instantâneas

O projeto HashClash (Marc Stevens, CWI Amsterdam) continuou levando a geração de colisões MD5 a limites práticos. Em 2019, colisões MD5 de prefixo escolhido — onde um atacante pode escolher prefixos arbitrários para ambas as mensagens em colisão — podiam ser geradas em dias em hardware comum. Em 2022, implementações otimizadas reduziram isso para horas. Em 2024, um artigo do HashClash demonstrou colisões em menos de um minuto em uma única GPU moderna.

A trajetória é clara: os ataques de colisão MD5 não estão ficando mais difíceis conforme o hardware melhora — estão ficando mais fáceis. O que levava um cluster em 2004 leva um laptop em 2026.

SHA-256 — Por Que Ele Resiste

O SHA-256 faz parte da família SHA-2, projetada pela NSA e padronizada pelo NIST em 2001. Produz um digest de 256 bits (32 bytes). Nenhum ataque prático de colisão contra o SHA-256 é conhecido em 2026. Os melhores ataques publicados reduzem o fator de trabalho teórico para encontrar colisões a aproximadamente 2^187 operações — ainda muito além de qualquer recurso computacional que exista ou seja previsível.

A margem de segurança do SHA-256 é intencionalmente conservadora. Mesmo que o hardware melhore por um fator de um bilhão (aproximadamente 30 dobramentos em termos da Lei de Moore), quebrar o SHA-256 permanece computacionalmente inviável. O fator de trabalho efetivo do MD5 de 2^18 a 2^23 para colisões estava ao alcance de hardware modesto em 2004.

O SHA-256 também é mais rápido do que você poderia esperar: CPUs modernas incluem instruções SHA dedicadas (Intel SHA Extensions, ARM Cryptography Extensions) que permitem ao software computar milhões de hashes SHA-256 por segundo por núcleo. Não é significativamente mais lento que o MD5 para casos de uso típicos.

Quando o MD5 Ainda é Aceitável (Raramente)

"Comprometido" não significa "inútil para todo propósito". O MD5 permanece aceitável em contextos onde:

  • Não há adversário: detectar corrupção acidental de arquivo em um sistema interno confiável — não verificar downloads da internet, mas verificar se uma cópia de arquivo foi concluída com sucesso.
  • Velocidade importa mais que segurança: computar chaves de cache ou identificadores de fragmento onde uma colisão simplesmente significa uma falta de cache, não uma violação de segurança. O modelo de ameaça está ausente.
  • Você está correspondendo a um sistema externo existente: algumas APIs legadas ainda enviam ETags ou checksums MD5. Você pode aceitar e computar MD5 para interoperar, desde que não o use para decisões de segurança.
  • Particionamento de tabela hash: distribuir dados entre buckets pelo MD5 de uma chave. Colisões aqui causam desequilíbrio, não falhas de segurança.

O fio condutor: o MD5 é aceitável quando a aplicação não depende de resistência a colisão e não há adversário que possa criar entradas. Assim que qualquer condição muda — atacante presente, ou colisão = falha de segurança — mude para SHA-256.

Mitos Comuns Sobre o MD5

"MD5 é ok se adicionarmos um salt"

O salting muda a entrada para que dois usuários com a mesma senha obtenham hashes diferentes — ele previne ataques de rainbow table. Mas não conserta o problema de colisão. Um atacante com o hash MD5 salgado ainda pode fazer força bruta eficientemente porque o MD5 é rápido: GPUs modernas computam cerca de 10 a 30 bilhões de hashes MD5 por segundo. Um salt adiciona trabalho proporcional ao espaço de busca, não à dificuldade do algoritmo.

Para hash de senhas, nem o MD5 nem o SHA-256 são adequados independentemente do salting. Use bcrypt, scrypt ou Argon2.

"MD5 é ok porque usamos apenas internamente"

Sistemas internos são violados. O modelo de ameaça "o atacante não pode acessar nossas entradas" tende a funcionar até que um ataque à cadeia de suprimentos, uma ameaça interna ou uma misconfiguration exponha o sistema. O ataque Flame aconteceu contra sistemas que presumivelmente tinham confiança semelhante em seus controles internos.

"SHA-256 é exagero — MD5 é mais rápido"

Em hardware moderno com instruções de aceleração SHA, o SHA-256 é aproximadamente 2 a 5 vezes mais lento que o MD5. Para a maioria das aplicações — verificações de integridade de arquivo, assinaturas de API, chaves de cache — a diferença é de microssegundos por operação, imperceptível na prática. O argumento de desempenho para o MD5 sobre o SHA-256 só se sustenta em cenários de altíssima taxa de transferência onde mesmo microssegundos importam, e mesmo nesses casos geralmente há soluções melhores do que usar um algoritmo comprometido.

Guia de Migração — MD5 para SHA-256

Hash de senhas

// ERRADO: MD5 para hash de senha
const crypto = require('crypto');
const hash = crypto.createHash('md5').update(password).digest('hex');
// Tempo para quebrar com GPU moderna: segundos a minutos
// ERRADO: SHA-256 para hash de senha (ainda rápido demais)
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update(password).digest('hex');

// CORRETO: use bcrypt, scrypt ou Argon2 para senhas
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);

Migrar hashes de senhas armazenados requer uma abordagem gradual. A cada login bem-sucedido: verifique a senha contra o hash MD5 existente, depois recomputar imediatamente com bcrypt e substitua o valor armazenado. Marque cada conta como migrada. Após um período razoável (90 dias é típico), force uma redefinição de senha para quaisquer contas restantes ainda usando hashes MD5.

Integridade de arquivo / checksums

# Linux: verificar o download de um arquivo
sha256sum -c ubuntu-24.04-desktop-amd64.iso.sha256

# macOS
shasum -a 256 ubuntu-24.04-desktop-amd64.iso

# Windows PowerShell
Get-FileHash ubuntu-24.04-desktop-amd64.iso -Algorithm SHA256

Mudar verificações de integridade de arquivo do MD5 para SHA-256 geralmente é uma substituição simples no código. Os dois pontos de atenção: (1) checksums existentes armazenados em bancos de dados ou arquivos precisam ser recomputados e atualizados — não há atalho; (2) APIs externas ou sistemas de armazenamento que fornecem ETags MD5 (como algumas configurações do S3) requerem coordenação para mudar.

HMAC para autenticação de API

// HMAC-SHA-256 para autenticação de mensagem
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', process.env.SECRET_KEY)
  .update(message)
  .digest('hex');

Se você usa HMAC-MD5 para assinatura de requisições de API, mude para HMAC-SHA-256. A construção HMAC adiciona uma chave secreta, o que limita alguns ataques MD5, mas o HMAC-MD5 tem vulnerabilidades de extensão de comprimento e o primitivo subjacente ainda está comprometido. Padrões modernos (JWT, AWS SigV4, OAuth 2.0) todos especificam HMAC-SHA-256. O gerador HMAC do Toova suporta tanto HMAC-SHA-256 quanto HMAC-SHA-512 para testes.

Assinaturas digitais e certificados

Qualquer certificado assinado com MD5 deve ser reemitido imediatamente — a maioria das autoridades certificadoras parou de emitir certificados assinados com MD5 após 2008, e todos os browsers e sistemas operacionais principais os rejeitam. Para PKI interna, audite a configuração da sua CA e certifique-se de que SHA-256 seja o algoritmo de assinatura mínimo permitido. RSA-SHA256 ou ECDSA-SHA256 são os padrões atuais.

MD5 vs SHA-256 — Referência Rápida

Propriedade MD5 SHA-256
Comprimento da saída 128 bits (32 chars hex) 256 bits (64 chars hex)
Resistência a colisão Comprometido (ataques práticos) Seguro (sem ataques conhecidos)
Hash de senhas Nunca Não (use bcrypt/Argon2)
Assinaturas digitais Nunca Sim
Integridade de arquivo (segurança) Nunca Sim
Checksums não relacionados à segurança Aceitável (sem atacante) Sempre aceitável
Chaves de cache Aceitável Sempre aceitável
Assinatura de certificado TLS Rejeitado por browsers Padrão
Conformidade com FIPS 140-3 Não (descontinuado) Sim

Conclusão

O MD5 tem sido criptograficamente comprometido desde 2004. Colisões de prefixo escolhido — a técnica que alimentou o malware Flame — são agora computacionalmente baratas. Qualquer aplicação que depende do MD5 para segurança (assinaturas, verificação de integridade, autenticação) é vulnerável a ataques que custam minutos de tempo de computação para executar.

O SHA-256 não tem ataques práticos conhecidos, é acelerado por hardware em CPUs modernas e é o padrão para integridade criptográfica em TLS, assinatura de código e autenticação de API. O custo de desempenho comparado ao MD5 é negligenciável para quase todo caso de uso.

O caminho de migração é direto: verificações de integridade de arquivo são uma substituição simples. Assinaturas de API requerem coordenar uma atualização de versão. Hashes de senhas precisam de uma estratégia gradual de recomputação no login. Para qualquer código novo, o SHA-256 deve ser a escolha padrão. Compute e compare hashes diretamente com o MD5 do Toova e o SHA-256 do Toova — ou gere códigos de autenticação HMAC-SHA-256 com o gerador HMAC.