Vai al contenuto
Toova
Tutti gli strumenti

MD5 vs SHA-256 — Perché Dovresti Smettere di Usare MD5

Toova

MD5 è ovunque. È presente in ogni linguaggio di programmazione, ogni database, ogni SDK di cloud provider. Gli sviluppatori lo usano per abitudine — è veloce, produce una stringa hex ordinata di 32 caratteri, e l'API richiede due righe di codice. Il problema: MD5 è crittograficamente compromesso dal 2004, e gli attacchi sono diventati solo più veloci e più economici da allora.

Non è teorico. Un cyberattacco del 2012 sull'infrastruttura iraniana — il malware Flame — ha falsificato un certificato di firma del codice Microsoft sfruttando una collisione MD5. La stessa tecnica che i crittografi accademici avevano dimostrato in un paper è diventata un'arma usata nello spionaggio geopolitico. MD5 non è leggermente indebolito; è fondamentalmente compromesso per qualsiasi applicazione dove un avversario può scegliere gli input.

SHA-256, parte della famiglia SHA-2 standardizzata dal NIST, non ha attacchi di collisione noti e rimane lo standard per l'integrità crittografica nel 2026. Questo articolo spiega esattamente cosa significa la differenza, quando (raramente) MD5 è ancora accettabile, e come migrare in sicurezza. Puoi calcolare entrambi gli hash istantaneamente con gli strumenti MD5 hash di Toova e SHA-256 hash di Toova.

Come Funzionano le Funzioni Hash

Una funzione hash crittografica prende un input di qualsiasi lunghezza e produce un output di lunghezza fissa (il digest) con queste proprietà:

  • Deterministica: lo stesso input produce sempre lo stesso output.
  • Effetto valanga: un singolo cambio di bit nell'input cambia completamente l'output.
  • Resistenza alla preimmagine: dato un hash, è computazionalmente infattibile trovare l'input.
  • Resistenza alle collisioni: è computazionalmente infattibile trovare due input diversi che producono lo stesso hash.

L'effetto valanga è il motivo per cui sia MD5 che SHA-256 sembrano simili a prima 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

Un carattere cambiato nell'input ("dog" → "cog"), eppure l'output è completamente diverso. Questa proprietà vale per entrambi gli algoritmi. La differenza è cosa succede quando un attaccante cerca intenzionalmente di trovare una collisione.

MD5 — Una Cronologia di Fallimenti (1996–2025)

MD5 è stato progettato da Ron Rivest nel 1991 come sostituto di MD4. Nel 1996, Hans Dobbertin aveva trovato collisioni nella funzione di compressione di MD5 — non nell'algoritmo completo, ma un segnale d'allarme che il design era fragile. La comunità della sicurezza ha iniziato a raccomandare la migrazione a SHA-1. La maggior parte dei sistemi ha ignorato questo.

2004 — Collisioni complete dimostrate

Nell'agosto 2004, Xiaoyun Wang e Hongbo Yu hanno presentato un attacco di collisione pratico su MD5 alla conferenza CRYPTO. Riuscivano a generare due messaggi da 1.024 bit diversi con lo stesso hash MD5 in meno di un'ora su un cluster. La garanzia fondamentale di MD5 — la resistenza alle collisioni — era compromessa.

Il NIST ha immediatamente iniziato a deprecare MD5 per uso federale. La maggior parte delle linee guida del settore ha seguito. Il dispiegamento effettivo di MD5 nei sistemi di produzione è cambiato a malapena.

2008 — Certificati CA canaglia

Un gruppo di ricercatori ha dimostrato di poter creare un certificato di Certificate Authority canaglia che sarebbe stato considerato attendibile da tutti i principali browser. L'attacco sfruttava il fatto che diverse autorità di certificazione stavano ancora firmando certificati con MD5. I ricercatori hanno generato una collisione tra una richiesta di certificato dall'aspetto legittimo e un certificato CA autoprodotto — poi hanno fatto firmare da una CA reale quello legittimo, producendo una firma valida anche per il CA falsificato.

Ogni browser importante ha immediatamente bloccato i certificati firmati con MD5. La lezione principale: le debolezze crittografiche diventano sfruttabili nel momento in cui un attaccante controlla l'input alla funzione hash.

2012 — Il malware Flame

Il malware di cyberespionaggio Flame, scoperto nel 2012 e attribuito ad attori statali, ha falsificato un certificato di Windows Update Microsoft usando una collisione MD5 chosen-prefix. Il risultato: Flame poteva distribuirsi tramite Windows Update come se fosse un aggiornamento Microsoft legittimo, con una firma Microsoft valida. Centinaia di migliaia di macchine Windows in Iran, Libano, Siria e Sudan sono state infettate. Consulta l'articolo Wikipedia sul malware Flame per la storia completa.

2019–2025 — HashClash e collisioni istantanee

Il progetto HashClash (Marc Stevens, CWI Amsterdam) ha continuato a spingere la generazione di collisioni MD5 ai limiti pratici. Entro il 2019, le collisioni MD5 chosen-prefix potevano essere generate in giorni su hardware commodity. Entro il 2022, le implementazioni ottimizzate avevano ridotto questo a ore. Nel 2024, un paper di HashClash ha dimostrato collisioni in meno di un minuto su una singola GPU moderna.

La traiettoria è chiara: gli attacchi di collisione MD5 non diventano più difficili con il miglioramento dell'hardware — diventano più facili. Quello che richiedeva un cluster nel 2004 richiede un laptop nel 2026.

SHA-256 — Perché Tiene

SHA-256 fa parte della famiglia SHA-2, progettata dalla NSA e standardizzata dal NIST nel 2001. Produce un digest da 256 bit (32 byte). Non sono noti attacchi di collisione pratici contro SHA-256 al 2026. I migliori attacchi pubblicati riducono il fattore di lavoro teorico per trovare collisioni a circa 2^187 operazioni — ancora ben oltre qualsiasi risorsa computazionale che esiste o è prevedibile.

SHA-256 è anche più veloce di quanto potresti aspettarti: le CPU moderne includono istruzioni SHA dedicate (Intel SHA Extensions, ARM Cryptography Extensions) che permettono al software di calcolare milioni di hash SHA-256 al secondo per core. Non è significativamente più lento di MD5 per i casi d'uso tipici.

Quando MD5 è Ancora Accettabile (Raramente)

"Compromesso" non significa "inutile per ogni scopo." MD5 rimane accettabile in contesti dove:

  • Non c'è nessun avversario: rilevare la corruzione accidentale dei file in un sistema interno affidabile — non verificare i download da internet, ma controllare se una copia di file è stata completata correttamente.
  • La velocità conta più della sicurezza: calcolare chiavi di cache o identificatori di shard dove una collisione significa semplicemente un cache miss, non una violazione della sicurezza.
  • Stai corrispondendo a un sistema esterno esistente: alcune API legacy inviano ancora ETag o checksum MD5. Puoi accettarli e calcolare MD5 per interoperare, purché non lo usi per decisioni di sicurezza.
  • Partizionamento di hash table: distribuzione dei dati tra bucket tramite MD5 di una chiave.

Il filo comune: MD5 è accettabile quando l'applicazione non dipende dalla resistenza alle collisioni e non c'è nessun avversario che può creare input. Non appena una delle due condizioni si rompe — attaccante presente, o collisione = fallimento di sicurezza — passa a SHA-256.

Miti Comuni su MD5

"MD5 va bene se aggiungiamo un salt"

Il salting cambia l'input in modo che due utenti con la stessa password ottengano hash diversi — previene gli attacchi rainbow table. Ma non risolve il problema delle collisioni. Un attaccante con l'hash MD5 con sale può ancora eseguire il brute-force in modo efficiente perché MD5 è veloce: le GPU moderne calcolano circa 10-30 miliardi di hash MD5 al secondo. Un salt aggiunge lavoro proporzionale allo spazio di ricerca, non alla difficoltà dell'algoritmo.

Per l'hashing delle password, né MD5 né SHA-256 è appropriato indipendentemente dal salting. Usa bcrypt, scrypt o Argon2.

"MD5 va bene perché lo usiamo solo internamente"

I sistemi interni vengono violati. Il modello di minaccia "l'attaccante non può accedere ai nostri input" tende a reggere fino a un attacco alla supply chain, una minaccia interna o una errata configurazione che espone il sistema. L'attacco Flame è avvenuto contro sistemi che presumibilmente avevano una fiducia simile nei loro controlli interni.

"SHA-256 è eccessivo — MD5 è più veloce"

Su hardware moderno con istruzioni di accelerazione SHA, SHA-256 è circa 2-5 volte più lento di MD5. Per la maggior parte delle applicazioni — verifiche di integrità dei file, firme API, chiavi di cache — la differenza è di microsecondi per operazione, impercettibile in pratica. L'argomento delle prestazioni per MD5 su SHA-256 vale solo in scenari ad altissimo throughput dove anche i microsecondi contano, e anche in quel caso di solito ci sono soluzioni migliori che usare un algoritmo compromesso.

Guida alla Migrazione — da MD5 a SHA-256

Hashing delle password

// SBAGLIATO: MD5 per l'hashing delle password
const crypto = require('crypto');
const hash = crypto.createHash('md5').update(password).digest('hex');
// Tempo di violazione con GPU moderna: da secondi a minuti
// SBAGLIATO: SHA-256 per l'hashing delle password (ancora troppo veloce)
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update(password).digest('hex');

// CORRETTO: usa bcrypt, scrypt o Argon2 per le password
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);

La migrazione degli hash delle password memorizzate richiede un approccio graduale. Ad ogni login riuscito: verifica la password contro l'hash MD5 esistente, poi riesegui immediatamente l'hash con bcrypt e sostituisci il valore memorizzato. Contrassegna ogni account come migrato. Dopo un periodo ragionevole (90 giorni è tipico), forza il reset della password per tutti gli account rimanenti che usano ancora hash MD5.

Integrità dei file / checksum

# Linux: verifica il download di un file
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

Passare le verifiche di integrità dei file da MD5 a SHA-256 è di solito un semplice trova-e-sostituisci nel codice. Le due insidie: (1) i checksum esistenti memorizzati in database o file devono essere ricalcolati e aggiornati — non ci sono scorciatoie; (2) le API esterne o i sistemi di archiviazione che forniscono ETag MD5 richiedono coordinamento per cambiare.

HMAC per l'autenticazione API

// HMAC-SHA-256 per l'autenticazione dei messaggi
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', process.env.SECRET_KEY)
  .update(message)
  .digest('hex');

Se usi HMAC-MD5 per la firma delle richieste API, passa a HMAC-SHA-256. La costruzione HMAC aggiunge una chiave segreta, che limita alcuni attacchi MD5, ma HMAC-MD5 ha vulnerabilità di estensione della lunghezza e il primitivo sottostante è ancora compromesso. Gli standard moderni (JWT, AWS SigV4, OAuth 2.0) specificano tutti HMAC-SHA-256. Il generatore HMAC di Toova supporta sia HMAC-SHA-256 che HMAC-SHA-512 per i test.

Firme digitali e certificati

Qualsiasi certificato firmato con MD5 dovrebbe essere riemesso immediatamente — la maggior parte delle autorità di certificazione ha smesso di emettere certificati firmati con MD5 dopo il 2008, e tutti i principali browser e sistemi operativi li rifiutano. Per la PKI interna, controlla la configurazione della tua CA e assicurati che SHA-256 sia l'algoritmo di firma minimo consentito. RSA-SHA256 o ECDSA-SHA256 sono gli standard attuali.

MD5 vs SHA-256 — Riferimento Rapido

Proprietà MD5 SHA-256
Lunghezza output 128 bit (32 char hex) 256 bit (64 char hex)
Resistenza alle collisioni Compromessa (attacchi pratici) Sicura (nessun attacco noto)
Hashing password Mai No (usa bcrypt/Argon2)
Firme digitali Mai
Integrità file (sicurezza) Mai
Checksum non di sicurezza Accettabile (senza attaccante) Sempre fine
Chiavi di cache Accettabile Sempre fine
Firma certificati TLS Rifiutato dai browser Standard
Conforme FIPS 140-3 No (deprecato)

Conclusione

MD5 è crittograficamente compromesso dal 2004. Le collisioni chosen-prefix — la tecnica che ha alimentato il malware Flame — sono ora computazionalmente economiche. Qualsiasi applicazione che si basa su MD5 per la sicurezza (firme, verifica dell'integrità, autenticazione) è vulnerabile ad attacchi che costano minuti di tempo di calcolo per essere eseguiti.

SHA-256 non ha attacchi pratici noti, è accelerato via hardware sulle CPU moderne ed è lo standard per l'integrità crittografica in TLS, firma del codice e autenticazione API. Il costo prestazionale rispetto a MD5 è trascurabile per quasi tutti i casi d'uso.

Il percorso di migrazione è diretto: le verifiche di integrità dei file sono un trova-e-sostituisci. Le firme API richiedono il coordinamento di un bump di versione. Gli hash delle password necessitano di una strategia di rihashing graduale al login. Per qualsiasi nuovo codice, SHA-256 dovrebbe essere la scelta predefinita. Calcola e confronta gli hash direttamente con Toova MD5 e Toova SHA-256 — o genera codici di autenticazione HMAC-SHA-256 con il generatore HMAC.