Una funzione hash crittografica è uno degli strumenti più usati e meno visibili dell'informatica. Non cifra nulla e non ha chiavi, eppure senza di essa non esisterebbero firme digitali, verifiche dei download, blockchain o acquisizioni forensi attendibili. Vediamo cos'è, quali proprietà deve avere e quali algoritmi usare oggi.
Un'impronta digitale per i dati
Una funzione hash prende in ingresso dati di qualsiasi lunghezza, da una parola a un disco intero, e restituisce un valore di lunghezza fissa, chiamato hash, digest o impronta. Con SHA-256, per esempio, l'uscita è sempre di 256 bit, di solito scritta come 64 caratteri esadecimali.
L'hash SHA-256 della stringa "abc" è:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
Basta cambiare una sola lettera, o aggiungere uno spazio, e il risultato cambia completamente, senza alcuna somiglianza con il precedente. Questo comportamento si chiama effetto valanga.
Le tre proprietà di sicurezza
Non ogni funzione che riassume dei dati è adatta all'uso crittografico. Un checksum come il CRC serve a rilevare errori di trasmissione accidentali, ma non resiste a chi vuole manipolare i dati di proposito. Una funzione hash crittografica deve garantire tre proprietà:
- Resistenza alla preimmagine: dato un hash, deve essere impraticabile trovare un qualsiasi messaggio che lo produca. La funzione è "a senso unico".
- Resistenza alla seconda preimmagine: dato un messaggio, deve essere impraticabile trovarne un altro, diverso, con lo stesso hash.
- Resistenza alle collisioni: deve essere impraticabile trovare due messaggi qualsiasi con lo stesso hash.
Le collisioni esistono per forza, perché gli input possibili sono infiniti e le uscite no. La sicurezza sta nel fatto che trovarne una richieda una quantità di calcolo irraggiungibile.
Algoritmi superati e algoritmi attuali
| Algoritmo | Lunghezza uscita | Stato |
|---|---|---|
| MD5 | 128 bit | Collisioni pratiche, da non usare per la sicurezza |
| SHA-1 | 160 bit | Collisione pratica dimostrata nel 2017, superato |
| SHA-256 / SHA-512 (famiglia SHA-2) | 256 / 512 bit | Sicuri e diffusissimi |
| SHA-3 | 224-512 bit | Sicuro, struttura interna diversa da SHA-2 |
| BLAKE2 / BLAKE3 | variabile | Sicuri e molto veloci |
Per MD5 le collisioni si generano ormai in poco tempo su un normale computer. Sono state usate anche in attacchi reali per creare certificati falsi. Per SHA-1, nel 2017 un gruppo di ricercatori ha prodotto due file PDF diversi con lo stesso hash, dimostrando che l'attacco non era più solo teorico.
SHA-3 non è nato perché SHA-2 fosse rotto, ma per avere un'alternativa basata su un principio di costruzione differente, nel caso in cui in futuro venissero scoperte debolezze nella famiglia SHA-2.
A cosa servono, in concreto
Verificare l'integrità dei file
Molti siti di software pubblicano l'hash SHA-256 dei file scaricabili. Calcolando l'hash del file ricevuto e confrontandolo con quello pubblicato, verifichi che non sia stato danneggiato o alterato. Attenzione: la verifica ha senso solo se l'hash di riferimento proviene da una fonte affidabile, diversa da quella che potrebbe essere stata manomessa.
Firme digitali
Una firma digitale non si applica all'intero documento, ma al suo hash. È molto più efficiente e, grazie alla resistenza alle collisioni, firmare l'impronta equivale a firmare il documento. Se un algoritmo hash diventa vulnerabile alle collisioni, anche le firme basate su di esso perdono valore: è il motivo per cui SHA-1 è stato abbandonato nei certificati.
Prove digitali
Nel mio lavoro di informatica forense l'hash è lo strumento che lega una copia al suo originale: si calcola l'impronta del supporto acquisito e la si annota; chiunque, in seguito, può ricalcolarla e verificare che la copia non sia cambiata di un solo bit.
Codici di autenticazione dei messaggi
Combinando un hash con una chiave segreta si ottiene un HMAC, che permette a chi condivide la chiave di verificare sia l'integrità sia l'origine di un messaggio. È usato nei protocolli di rete, nelle API e nei token di autenticazione.
Blockchain e strutture di dati
Nelle blockchain ogni blocco contiene l'hash del precedente: modificare un blocco cambia il suo hash e rompe la catena. Gli alberi di Merkle, basati su hash annidati, permettono di verificare un singolo elemento di un grande insieme senza scaricarlo tutto.
Un caso a parte: le password
Gli hash generici come SHA-256 sono progettati per essere veloci. Per conservare le password questa è una debolezza: un attaccante che sottrae il database può provare miliardi di combinazioni al secondo. Per le password si usano funzioni appositamente lente e con sale, come Argon2, scrypt o bcrypt. Usare un semplice SHA-256, anche con sale, non è sufficiente.
In sintesi
- Una funzione hash produce un'impronta di lunghezza fissa che cambia completamente a ogni minima modifica dei dati.
- Deve resistere a preimmagine, seconda preimmagine e collisioni.
- MD5 e SHA-1 sono superati; oggi si usano SHA-2, SHA-3 o BLAKE2/BLAKE3.
- Gli hash sono alla base di verifiche dei file, firme digitali, prove forensi, HMAC e blockchain.
- Per le password servono funzioni lente dedicate, non hash veloci.