MD5 vs SHA-256: differenze e raccomandazioni

MD5 e SHA-256 sono due funzioni di hashing crittografico. Producono un'impronta di dimensione fissa a partire da un input di dimensione arbitraria. Le si incontra ovunque: verifica di integrità dei file, firme, identificatori univoci, certificati TLS, blockchain. Il loro stato di sicurezza è invece molto diverso: MD5 è rotto dal 2004 per gli usi crittografici, SHA-256 resta sicuro nel 2026. Questo articolo fa il punto.

Promemoria sulle funzioni di hashing

Una funzione di hashing crittografico trasforma un messaggio di lunghezza qualsiasi in un'impronta di dimensione fissa. Tre proprietà attese:

  • Resistenza alla preimmagine: dato un hash, deve essere impraticabile risalire al messaggio originale.
  • Resistenza alla seconda preimmagine: dato un messaggio, deve essere impraticabile trovarne un altro che produca lo stesso hash.
  • Resistenza alle collisioni: deve essere impraticabile trovare due messaggi distinti che producano lo stesso hash.

Una funzione è detta rotta non appena una di queste proprietà cade. Per MD5, la resistenza alle collisioni è caduta nel 2004.

MD5: 128 bit, rotto dal 2004

MD5 (Message Digest 5) è una funzione progettata da Ronald Rivest nel 1991 e standardizzata dalla RFC 1321. Produce un'impronta di 128 bit (16 byte, 32 caratteri esadecimali).

Nel 2004, Wang e Yu pubblicano un attacco che produce collisioni MD5 in poche ore su un PC. Da allora, il costo di generazione di una collisione è sceso a pochi secondi. Nel 2008, dei ricercatori hanno fabbricato un falso certificato SSL firmato MD5 riconosciuto valido da tutti i browser. Nel 2012, il malware Flame utilizzava una collisione MD5 per firmare il suo eseguibile come un binario Microsoft legittimo.

Conclusione: MD5 non deve più servire dal momento in cui un attaccante può influenzare l'input. Tutti gli usi crittografici (firme, integrità di fronte a un avversario, derivazione di chiave) sono esclusi. Solo alcuni usi senza ostilità restano accettabili, come un checksum di trasferimento di rete o una chiave di cache: MD5 resta veloce, e la collisione involontaria resta statisticamente impossibile.

SHA-256: 256 bit, sicuro nel 2026

SHA-256 appartiene alla famiglia SHA-2 pubblicata dal NIST nel 2001 e standardizzata dal FIPS 180-4. Produce un'impronta di 256 bit (32 byte, 64 caratteri esadecimali).

Nessun attacco pratico è noto contro SHA-256. Il miglior attacco teorico sulle collisioni riguarda 31 round su 64, senza implicazioni pratiche. Il costo di forza bruta per trovare una collisione è dell'ordine di 2^128 operazioni, fuori portata di qualsiasi infrastruttura nota.

SHA-256 è utilizzato in: TLS (certificati X.509), Git (dalla transizione SHA-256), Bitcoin (proof of work), firme dei pacchetti Linux, Windows Update, ecc. È oggi l'hash raccomandato di default per la maggior parte degli usi crittografici generali.

Differenze pratiche

Lunghezza di output

MD5("hello")     = 5d41402abc4b2a76b9719d911017c592               (32 chars hex)
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 (64 chars hex)

Velocità

MD5 è circa 2 o 3 volte più veloce di SHA-256 sulla stessa macchina. Su una CPU moderna, MD5 tratta diversi GB/s per core, SHA-256 è dell'ordine del GB/s. Sulle CPU recenti con estensione SHA-NI, il divario si riduce fortemente.

Sicurezza

È l'unica differenza che conta davvero: MD5 è rotto per le collisioni, SHA-256 no. Se la sicurezza di fronte a un avversario è in gioco, la scelta è netta.

Tabella comparativa

Criterio MD5 SHA-256
Anno19912001
Dimensione di output128 bit / 32 hex256 bit / 64 hex
Resistenza alle collisioniRotta dal 2004Nessun attacco pratico
Velocità relativaDa 2 a 3 volte più veloceRiferimento
Accelerazione hardwareNessuna dedicataSHA-NI su CPU recenti
Uso crittograficoSconsigliatoRaccomandato
Uso integrità non ostileAccettabileRaccomandato
Conformità normativaRifiutata (PCI-DSS, FIPS)Accettata

Casi d'uso

Quando MD5 resta accettabile

  • Chiave di cache applicativo (Redis, memcached) senza implicazioni di sicurezza
  • Rilevamento di duplicati in un dataset non ostile
  • Checksum di un trasferimento di rete per rilevare una corruzione accidentale
  • Impronta di una stringa per ripartizione (sharding) senza vincoli adversariali

Quando SHA-256 si impone

  • Verifica di integrità di fronte a un attaccante (download firmati, pacchetti)
  • Firme digitali, certificati X.509
  • Identificatori Git di commit e oggetti
  • Derivazione di chiavi (in combinazione con HKDF)
  • Qualsiasi applicazione soggetta a un requisito normativo (PCI-DSS, ANSSI, FIPS)

Esempi concreti

In PHP, le due funzioni sono disponibili tramite la funzione hash():

// Impronta di una stringa
$md5    = hash('md5',     'hello world');
$sha256 = hash('sha256',  'hello world');

// Impronta di un file (lettura in streaming)
$md5File    = hash_file('md5',    '/path/to/file.iso');
$sha256File = hash_file('sha256', '/path/to/file.iso');

Puoi generare queste impronte direttamente online con il nostro generatore di hash testo, hashare un file con il generatore di hash di file, o identificare un tipo di hash sconosciuto con l'identificatore di hash.

Raccomandazione

La regola del 2026 è semplice: SHA-256 di default. MD5 non deve più apparire nel tuo codice dal momento in cui un attaccante può influenzare l'input, il che copre la quasi totalità dei casi server. La performance superiore di MD5 non giustifica più il suo uso, il divario è diventato trascurabile con le accelerazioni SHA-NI presenti sulle CPU x86 e ARM moderne.

Domande frequenti

MD5 è ancora sicuro per le password?

No, mai. E questo punto è indipendente dalle collisioni: MD5 è troppo veloce. Una GPU cracca diversi miliardi di hash MD5 al secondo, il che rende qualsiasi attacco a dizionario o di forza bruta banale. Per le password, usa bcrypt, Argon2 o scrypt (vedi il nostro comparativo Bcrypt vs Argon2).

Qual è la differenza tra SHA-256 e SHA-2?

SHA-2 è la famiglia, SHA-256 ne è un membro. La famiglia comprende SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224 e SHA-512/256. Differiscono per la dimensione di output e la dimensione dei blocchi interni. SHA-256 è la variante più utilizzata.

Bisogna passare a SHA-3?

Non necessariamente. SHA-3 (pubblicato nel 2015) si basa su una costruzione radicalmente diversa (Keccak / sponge), ma SHA-256 resta sicuro. SHA-3 serve soprattutto come piano B in caso di problema inatteso su SHA-2. Scegli SHA-3 se una norma lo richiede, o se vuoi una diversità crittografica. Altrimenti, SHA-256 resta la scelta standard.

Si può invertire un hash MD5 o SHA-256?

No, per costruzione: un hash perde informazione. I siti di «decrittazione» MD5 non fanno altro che interrogare basi gigantesche di hash precalcolati (rainbow table) per input comuni. Per dati casuali lunghi, recuperare l'input è impossibile con entrambi gli algoritmi.

SHA-256 sarà rotto da un computer quantistico?

L'algoritmo di Grover divide per due la sicurezza effettiva degli hash di fronte a un attaccante quantistico: SHA-256 offrirebbe allora circa 128 bit di sicurezza, il che resta ampiamente sufficiente. Nessuna urgenza lato hash, contrariamente alla crittografia asimmetrica.