MD5 vs SHA-256 — Perché Dovresti Smettere di Usare MD5
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 | Sì |
| Integrità file (sicurezza) | Mai | Sì |
| 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) | Sì |
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.