Comparison
SHA-256 vs MD5: non usare mai MD5 per la sicurezza
Uno è morto per la sicurezza. L'altro è il default moderno. Non confondeteli.
By Buğra SözeriPublished
TL;DR.MD5 è crittograficamente rotto dal 2004 — le collisioni si trovano in meno di un’ora su un laptop — quindi non usarlo mai per la sicurezza. SHA-256 non ha collisioni pratiche note ed è il default moderno per TLS, JWT, Bitcoin, Git (nuovi repo) e HMAC. Entrambi vanno bene per i checksum non avversariali, ma SHA-256 non è significativamente più lento sulle CPU moderne.
MD5 e SHA-256 sono entrambe funzioni hash crittografiche — prendono input di qualsiasi lunghezza e producono un output di lunghezza fissa (128 bit per MD5, 256 bit per SHA-256). Entrambi sono deterministici, entrambi veloci, e sembrano superficialmente intercambiabili. Non lo sono. MD5 è crittograficamente rotto dal 2004. SHA-256 va bene.
Il titolo
| Proprietà | MD5 | SHA-256 |
|---|---|---|
| Dimensione output | 128 bit (32 char hex) | 256 bit (64 char hex) |
| Pubblicato | 1991 | 2001 (NIST FIPS 180-2) |
| Collisione trovata | 2004 (Wang et al.) | Non ancora (2026) |
| Collisioni a prefisso scelto | Pratiche dal 2007 | Nessuna nota |
| Usato per TLS, JWT, crypto? | No | Sì |
Perché MD5 è rotto
Una funzione hash crittografica dovrebbe rendere computazionalmente impossibile trovare due input diversi che producono lo stesso output (una “collisione”). Nel 2004 Xiaoyun Wang e il suo team hanno pubblicato un metodo per trovare collisioni MD5 in circa un’ora su un computer personale.
È peggiorato. Nel 2007 è emerso un attacco a collisione a prefisso scelto — dati due qualsiasi header di file arbitrari, un attaccante poteva aggiungere byte appositamente costruiti per far collidere entrambi i file in MD5. Questo è stato usato nel 2008 per falsificare una firma di certificate authority con un cluster di PlayStation 3 da $657.
Per scopi di sicurezza, MD5 è morto. Chiunque usi MD5 per la verifica delle firme, l’integrità del contenuto o l’hashing delle password sta usando crittografia rotta.
Dove MD5 è ancora accettabile
MD5 non è rotto del tutto; è rotto per gli usi crittografici. Due categorie dove va ancora bene:
- Checksum non avversariali.Verificare che un download non sia stato corrotto, o che una voce cache corrisponda a una chiave. Non c’è un attaccante; hai solo bisogno di un’impronta digitale veloce e deterministica. MD5 va bene.
- Deduplicazione. Rilevare che due file sono identici, dove la falsificazione di una collisione non aiuterebbe nessun plausibile attaccante (sistema di archiviazione, cache di build).
Anche in questi casi, SHA-256 è raramente significativamente più lento sull’hardware moderno — le CPU Intel e AMD hanno entrambe istruzioni SHA native. Non c’è nessun motivo reale per usare MD5 per default anymore.
Dove SHA-256 è la scelta giusta
- Handshake TLS e firme dei certificati. SHA-256 è lo standard moderno.
- Firme JWT (HS256, RS256, ES256). Il 256 si riferisce a SHA-256.
- Hash blocchi Bitcoin. Bitcoin usa SHA-256 due volte nel suo proof-of-work.
- Hash oggetti Git. Git sta migrando da SHA-1 (anch’esso rotto) a SHA-256; i nuovi repository dovrebbero usare SHA-256 fin dall’inizio.
- Autenticazione dei messaggi basata su HMAC. HMAC-SHA256 è lo standard.
E SHA-1?
SHA-1 (160 bit) si trova tra MD5 e SHA-256 sulla linea del tempo. Le collisioni teoriche erano state predette nel 2005; la prima collisione pratica (SHAttered) è stata pubblicata nel 2017 da Google. SHA-1 è deprecato per gli usi di sicurezza, anche se Git lo usa ancora (con un ampio rilevamento delle collisioni sovrapposto) fino al completamento della migrazione a SHA-256.
E MD5 per le password?
Non farlo. Non usare nemmeno SHA-256 direttamente. L’hashing delle password richiede una funzione lenta e memory-hard — bcrypt, scrypt o argon2. SHA-256 puro è troppo veloce: un attaccante con GPU moderne può calcolare ~10 miliardi di SHA-256 al secondo, forzando le password deboli in pochi minuti. Le funzioni di hashing lente rendono questo attacco economicamente impossibile.
La regola pragmatica
Se stai hashando per qualsiasi motivo che tocca la sicurezza — autenticazione, verifica delle firme, integrità del contenuto che un attaccante potrebbe voler ingannare — usa SHA-256 o più forte.
Se stai hashando per impronte digitali non avversariali — deduplicazione, archiviazione indirizzabile per contenuto dove controlli tutti gli input — MD5 è tecnicamente accettabile, ma SHA-256 non è più lento sull’hardware moderno, quindi usalo per default comunque. Il costo di sbagliare riguardo a quale categoria sei è alto; il costo di usare sempre SHA-256 è essenzialmente zero.
Usa il nostro generatore di hash per entrambi tramite Web Crypto — anche se notabilmente non includiamo MD5 nell’interfaccia, perché il browser non lo fornisce nativamente e preferiamo non incoraggiarne l’uso.
Dati numerici
- Lunghezza output: MD5 = 128 bit / 32 char hex; SHA-256 = 256 bit / 64 char hex — esattamente 2× i bit.
- Resistenza alle collisioni: MD5 ~2¹⁸ oggi (letteralmente secondi su un laptop); SHA-256 ~2¹²⁸ — un rapporto di 2¹¹⁰×.
- Throughput su AMD Zen 4 con SHA-NI: MD5 ~700 MB/s; SHA-256 ~1,9 GB/s. Con accelerazione hardware SHA-256 è ora ~2,5× più veloce di MD5 — l’argomento della velocità per MD5 si è invertito.
- Senza accelerazione: MD5 ~500 MB/s, SHA-256 ~250 MB/s — il divario storico del 2×.
- Attacco Wang (2004): prima collisione MD5 pratica trovata in ~1 ora su un singolo PC. Gli attacchi moderni (HashClash) trovano collisioni in meno di 30 secondi su GPU commodity.
- Exploit rogue CA del 2008: Sotirov et al. hanno falsificato un certificato firmato CA usando 200 console PlayStation 3 (~$657 di calcolo) e una collisione a prefisso scelto MD5.
- Velocità brute-force GPU (RTX 4090): ~50 miliardi MD5/s, ~9 miliardi SHA-256/s — entrambi distruggono gli hash di password non salate in pochi minuti.
- Costo default Argon2id (OWASP 2024): 19 MiB memoria, 2 iterazioni, 1 parallelismo — ~50 ms per hash vs nanosecondi per SHA-256 grezzo.
Matrice decisionale
| Caso d’uso | Hash |
|---|---|
| Firma certificato TLS | SHA-256+ |
| Firma JWT | SHA-256 (HS256/RS256/ES256) |
| Firma codice / binario | SHA-256 |
| Proof-of-work Bitcoin / blockchain | SHA-256 (doppio) |
| Firma richiesta API HMAC | HMAC-SHA-256 |
| ETag S3 (upload singola parte) | MD5 — bloccato dal contratto AWS |
File md5sums pacchetti Linux | MD5 — legacy, ma le nuove distro aggiungono SHA-256 |
| Deduplicazione interna, input affidabili | Entrambi; default SHA-256 sulle CPU moderne |
| Hashing password | argon2id / bcrypt / scrypt — nessuno dei due grezzi |
Fonti
- Wang, X. et al. — Collisions for Hash Functions MD4, MD5, HAVAL-128 and RIPEMD, CRYPTO 2004 — eprint.iacr.org/2004/199.
- Sotirov, A. et al. — MD5 considered harmful today: Creating a rogue CA certificate, 25C3 (2008) — win.tue.nl/hashclash/rogue-ca.
- NIST FIPS 180-4 — Secure Hash Standard (SHS) — csrc.nist.gov.
Frequently asked questions
- MD5 è sicuro per l’hashing delle password?
- No, e nemmeno SHA-256 è la scelta giusta per le password. Entrambi sono troppo veloci — un attaccante con GPU moderne può calcolare ~10 miliardi di SHA-256 al secondo, forzando le password deboli in pochi minuti. Usa bcrypt, scrypt o argon2; sono deliberatamente lenti e memory-hard.
- Quando MD5 è ancora accettabile?
- Solo per le impronte digitali non avversariali dove nessun attaccante trae vantaggio da una collisione: controlli di integrità dei file su download affidabili, derivazione di chiavi cache, deduplicazione in un sistema che controlli end-to-end. Ovunque la sicurezza dipenda dall’hash, usa SHA-256 o più forte.
- SHA-256 è reversibile?
- No — le funzioni hash crittografiche sono unidirezionali per design. Non puoi derivare l’input dall’output. L’‘inversione’ basata su lookup (rainbow table) funziona solo per input che sono stati hashati in precedenza, e il salting sconfigge completamente le rainbow table.
- Perché MD5 è ancora ovunque se è rotto?
- Compatibilità retroattiva e inerzia. L’header Content-MD5, i gestori di pacchetti Linux, l’ETag di S3 per gli upload non multipart e innumerevoli strumenti interni emettono ancora MD5 perché il costo di cambiare il protocollo supera il costo del rischio residuo. I nuovi sistemi dovrebbero usare SHA-256 per default.
Related
Published May 14, 2026