Guide
Hashing crittografico spiegato: MD5, SHA-1, SHA-256, SHA-512
Tre proprietà, quattro algoritmi ancora degni di nota e un errore — usare SHA-256 per le password — che compare in metà dei report sulle violazioni.
By Buğra SözeriPublished
Un hash crittografico è una funzione che trasforma un input arbitrario in un’impronta digitale di dimensione fissa. La parola “crittografico” fa un lavoro reale in questa frase: non ogni funzione hash è idonea, e usarne una non crittografica (o quella sbagliata) è il modo in cui i sistemi diventano silenziosamente insicuri.
Cosa è un hash crittografico
Formalmente, una funzione hash H prende una stringa di byte arbitraria e restituisce un output di lunghezza fissa chiamato digest. SHA-256 restituisce 256 bit, SHA-512 restituisce 512, MD5 restituisce 128. Lo stesso input produce sempre lo stesso output; lo stesso output non rivela nulla sull’input.
Le tre proprietà che contano
1. Resistenza alla preimmagine
Dato un digest d, dovrebbe essere computazionalmente impossibile trovare qualsiasi input m tale cheH(m) = d. Questo è ciò che rende gli hash una funzione a senso unico — non si può invertire il digest per ottenere il messaggio.
2. Resistenza alla seconda preimmagine
Dato un input specifico m1, dovrebbe essere impossibile trovare un input diverso m2 tale che H(m1) = H(m2). Questa è la proprietà che protegge l’integrità.
3. Resistenza alle collisioni
Dovrebbe essere impossibile trovare qualsiasi due input distintim1 != m2 con H(m1) = H(m2). Per il paradosso del compleanno, trovare una collisione generica in un hash a N bit costa circa 2^(N/2) operazioni.
Quelli deprecati — e perché
MD5 (1992)
Output a 128 bit. Le collisioni furono pubblicate per la prima volta nel 2004; oggi si può trovare una collisione MD5 su un laptop in pochi minuti. MD5 è morto per qualsiasi scopo di sicurezza.
SHA-1 (1995)
Output a 160 bit. L’attacco SHAttered del 2017 di Google e CWI ha prodotto due PDF distinti con lo stesso hash SHA-1. NIST ha formalmente deprecato SHA-1 per le firme digitali nel 2011.
La famiglia SHA-2
SHA-2 è una famiglia di hash progettata dalla NSA e pubblicata dal NIST nel 2001: SHA-224, SHA-256, SHA-384, SHA-512. Nonostante il nome condiviso, SHA-2 è strutturalmente non correlato a SHA-1; gli attacchi che hanno compromesso SHA-1 non si trasferiscono.
- SHA-256 è il default pratico nel 2026.
- SHA-512 è più veloce su macchine a 64 bit e produce un digest più lungo.
Perché non si hasha le password con SHA-256
SHA-256 è veloce — una GPU moderna può calcolare miliardi al secondo. Per le password, questa velocità è esattamente la proprietà sbagliata. Le funzioni di hashing delle password sono progettate per essere deliberatamente lente e memory-hard. I tre nomi degni di nota nel 2026:
- bcrypt (1999). Fattore di lavoro regolabile. Ancora sicuro; il limite è il cap di input a 72 byte.
- scrypt (2009). Memory-hard, più difficile da accelerare con ASIC rispetto a bcrypt.
- Argon2 (vincitore PHC 2015). La raccomandazione attuale. Argon2id è la variante da usare. Specificato in
RFC 9106.
HMAC: hashing con una chiave
Un hash risponde a “questi dati sono invariati?”. Un HMAC risponde a “questi dati sono invariati equalcuno che conosce il segreto condiviso ha prodotto questo MAC?”.
HMAC-SHA-256 è la combinazione comune — tramite una costruzione specifica definita in RFC 2104. L’alternativa ingenua, H(chiave || messaggio), è vulnerabile agli attacchi di estensione della lunghezza sugli hash Merkle-Damgård (che include SHA-256). Usare sempre HMAC, non la forma ingenua.
Riferimento rapido
| Algoritmo | Bit output | Stato 2026 | Usato per |
|---|---|---|---|
| MD5 | 128 | Compromesso | Solo checksum non avversariali |
| SHA-1 | 160 | Deprecato | Solo compatibilità legacy |
| SHA-256 | 256 | Sicuro | Default per uso generico |
| SHA-512 | 512 | Sicuro | Margine extra o velocità a 64 bit |
| SHA-3-256 | 256 | Sicuro | Diversità strutturale, accelerazione hardware |
| bcrypt / Argon2 | variabile | Sicuro | Archiviazione password |
| HMAC-SHA-256 | 256 | Sicuro | Integrità autenticata dei messaggi |
Per l’hashing generico nel 2026, usare SHA-256. Per le password, usare Argon2id. Per i token di autenticazione, usare HMAC-SHA-256 (o una libreria JWTadeguata che lo usa internamente). Per l’integrità dei download, pubblicare digest SHA-256 tramite HTTPS. Verificare qualsiasi hash nel nostro generatore di hash nel browser.
Frequently asked questions
- SHA-256 è stato compromesso?
- No. Al 2026 non esiste nessun attacco di collisione o di preimmagine pubblicato su SHA-256 migliore della forza bruta. I migliori risultati di crittoanalisi noti riguardano solo varianti con round ridotti. NIST continua a raccomandare SHA-256 per l’hashing generico e le firme digitali.
- Perché non usare SHA-256 per hashare le password?
- Perché SHA-256 è progettato per essere veloce — miliardi di hash al secondo su una GPU moderna. Questa è esattamente la proprietà sbagliata per l’archiviazione delle password, dove si vuole che gli attaccanti impieghino secondi per ogni ipotesi, non nanosecondi. Usare bcrypt, scrypt o Argon2 — questi sono deliberatamente lenti, memory-hard e hanno un fattore di lavoro regolabile che si può aumentare man mano che l’hardware migliora.
- SHA-3 è più veloce di SHA-2?
- Generalmente più lento su CPU, più veloce in hardware. SHA-3 (Keccak) è stato selezionato come backup strutturale per SHA-2, non come sostituto — la sua costruzione a spugna è matematicamente distinta, quindi una ipotetica violazione di SHA-2 non si trasferirebbe a SHA-3.
- Qual è la differenza tra un hash e un HMAC?
- Un hash semplice prende dati in input e restituisce un digest. Un HMAC prende dati più una chiave segreta e restituisce un digest che può essere riprodotto solo da chi conosce la chiave. Si usano hash semplici per l’integrità e HMAC per l’autenticità.
- Quanto tempo ci vuole effettivamente per trovare una collisione SHA-256?
- Per il paradosso del compleanno, trovare una collisione in un output a 256 bit richiede circa 2^128 operazioni di hash. A un trilione (10^12) di hash al secondo su un milione di macchine, sarebbero ancora circa 10^19 anni — comodamente più a lungo dell’età dell’universo.
- Perché git usa ancora SHA-1?
- Principalmente per inerzia più mitigazioni. L’archiviazione indirizzata per contenuto di git non dipende dalla resistenza alle collisioni contro un avversario che controlla entrambi gli input — dipende dalla resistenza alla seconda preimmagine, che è ancora forte per SHA-1. Il git moderno implementa anche il rilevamento SHAttered. La transizione a SHA-256 è in corso ma lenta.
Related
Published May 31, 2026