L'impronta digitale: cambia una virgola e cambia tutto
Una funzione hash prende una sequenza di byte lunga quanto vuoi — tre lettere o un film — e ne tira fuori un numero sempre della stessa lunghezza. Non è una cifratura: da quel numero il testo non torna indietro. Qui le impronte si calcolano, ma soprattutto si mettono alla prova: si misura di quanto cambiano per una virgola, si prova a risalire a una password, e si guardano due file diversi che hanno lo stesso MD5.
1 · Da dove prendiamo i byte
Attenzione a cosa stai calcolando: questa è l'impronta dell'indirizzo, cioè delle lettere che hai incollato, non della pagina che c'è dietro. Nessuno scarica niente — cambia una maiuscola nel dominio, o aggiungi uno / in fondo, e l'impronta cambia tutta anche se la pagina che si apre è la stessissima. Per firmare il contenuto di una pagina bisogna prima scaricarlo, e poi usare la scheda File.
2 · L'effetto valanga, misurato
Prendiamo il testo del passo 1 e gli cambiamo il meno possibile. Se l'hash fosse una specie di riassunto, un cambiamento piccolo darebbe un risultato quasi uguale. Guarda cosa succede invece.
I 256 bit di SHA-256 in ordine.ribaltato rimasto com'era
3 · Si può tornare indietro?
La risposta breve è no: l'algoritmo non si inverte, non esiste una «funzione contraria». La risposta onesta è: non serve invertirlo. Se il testo di partenza è uno di quelli che la gente sceglie davvero, basta provarli tutti finché uno non fa quell'impronta.
4 · Due file diversi, la stessa impronta MD5
Il bollino «rotto» sopra non è un giudizio di anzianità. Vuol dire che qualcuno sa costruire due sequenze di byte diverse con lo stesso MD5. Queste due qui sotto sono la coppia pubblicata da Wang e Yu nel 2004: 128 byte ciascuna, sei byte di differenza.
Perché è grave: si fa firmare digitalmente il contratto innocuo, e la stessa firma vale identica sul contratto truccato — perché la firma non tocca il file, tocca la sua impronta. Nel 2008 un gruppo di ricercatori ha usato proprio questo per fabbricarsi un certificato da autorità di certificazione valido per tutti i browser del mondo. Con SHA-1 la stessa cosa è arrivata nel 2017 (due PDF diversi, stesso SHA-1: si chiamò SHAttered).
5 · A cosa serve tutto questo: la verifica
È l'uso quotidiano. Chi pubblica un file pubblica anche la sua impronta; tu scarichi, ricalcoli e confronti. Se un byte è cambiato per strada — rete ballerina, disco mezzo rotto, o qualcuno che ci ha messo le mani — il passo 2 ti ha già mostrato che te ne accorgi.
Il confronto è con quello che hai nel passo 1, su tutte e tre le impronte.
Come funziona
Che cos'è, in una riga
Una funzione hash crittografica è una macchina che prende qualunque sequenza di byte e restituisce sempre un numero della stessa taglia. SHA-256 restituisce 256 bit, che si scrivono per comodità come 64 cifre esadecimali. Non c'è una chiave, non c'è un segreto: chiunque, ovunque, con qualunque programma, dallo stesso ingresso ottiene la stessa identica uscita.
Le proprietà che servono
- Deterministica
- Stesso ingresso, stessa uscita. Sempre, su ogni macchina. Senza questo non si potrebbe confrontare niente.
- Lunghezza fissa
- Tre lettere o un film da 4 GB: 64 cifre in entrambi i casi. Anche zero byte hanno la loro impronta (provala col pulsante «niente» nel passo 1: è e3b0c442…, e la riconoscerai a occhio dopo un po' che frequenti l'argomento).
- Veloce da calcolare
- Che è insieme il pregio e il guaio: veloce per te che verifichi un file, veloce anche per chi prova miliardi di password. Vedi sotto.
- Effetto valanga
- Un bit diverso in ingresso ribalta circa metà dei bit in uscita, e non si può prevedere quali. È quello che hai misurato al passo 2.
- A senso unico
- Data l'impronta, non esiste un procedimento per ricostruire il messaggio: si può solo indovinare e verificare.
- Resistente alle collisioni
- Non deve essere praticabile costruire due messaggi diversi con la stessa impronta. È esattamente ciò che MD5 e SHA-1 non garantiscono più.
Le collisioni esistono per forza: il principio dei cassetti
I messaggi possibili sono infiniti; le impronte SHA-256 sono 2²⁵⁶, un numero grandissimo ma finito. Se metti infiniti calzini in un numero finito di cassetti, in qualche cassetto finiscono due calzini: due messaggi diversi con la stessa impronta esistono di sicuro. Nessuna funzione hash può evitarlo, ed è inutile prometterlo.
La sicurezza non sta nel non farle esistere, sta nel non saperle trovare. E qui la matematica è impietosa con l'intuito: per trovare una coppia qualsiasi non servono 2²⁵⁶ tentativi ma solo 2¹²⁸ — è il paradosso del compleanno, lo stesso per cui in una classe di 23 persone è probabile che due compiano gli anni lo stesso giorno. Ecco perché un hash da 256 bit offre 128 bit di sicurezza sulle collisioni: la metà.
«Matematicamente impossibile» è detto male
Si legge spesso che dall'impronta è matematicamente impossibile risalire al testo. Non è così, ed è una brutta bugia perché fa abbassare la guardia. La verità è più utile: non esiste scorciatoia migliore del provarle tutte, e provarle tutte costa troppo. Su 2²⁵⁶ possibilità, anche a mille miliardi di tentativi al secondo, servirebbero circa 10⁵⁷ anni — mentre l'universo ne ha 1,4 × 10¹⁰.
Ma questa difesa vale solo se il messaggio è imprevedibile. Se il messaggio è password, o una data di nascita, o il nome di una squadra, lo spazio da provare non è 2²⁵⁶: sono poche migliaia di casi, e li si esaurisce prima che tu finisca di leggere questa riga. Il passo 3 lo fa davvero, sul tuo dispositivo.
Perché le password non si custodiscono con SHA-256 e basta
Un sito serio non conserva le password: ne conserva l'impronta, così nemmeno chi amministra il database le legge. Ma un hash veloce da solo non basta, per tre motivi che si risolvono uno alla volta:
- Il sale (salt)
- Senza sale, due utenti con la stessa password hanno la stessa impronta scritta nel database — e chi lo ruba lo vede a occhio. Peggio: esistono tabelle già pronte con miliardi di impronte precalcolate. Il sale è un pezzetto casuale, diverso per ogni utente, attaccato alla password prima di calcolare l'hash. Non è segreto: sta lì accanto nel database. Non rende forte una password debole — il passo 3 lo mostra: se l'attaccante legge il sale, rifà la lista e la trova lo stesso. Serve a obbligarlo a rifare il lavoro per ogni singolo utente, invece di rompere tutto il database in un colpo solo.
- La lentezza
- Contro un hash veloce l'attaccante fa miliardi di tentativi al secondo. Perciò le password si custodiscono con funzioni apposta lente e regolabili — bcrypt, scrypt, Argon2 — tarate perché un tentativo costi qualche decimo di secondo. Per chi fa il login è impercettibile; per chi ne prova dieci miliardi è la differenza fra un pomeriggio e qualche millennio.
- La lunghezza
- Tutto il resto è mitigazione. L'unica cosa che davvero sposta il conto è avere qualcosa da indovinare: una frase lunga vale più di otto caratteri con un punto esclamativo alla fine.
Hash, cifratura e codifica non sono la stessa cosa
| Operazione | Si torna indietro? | Serve una chiave? | A cosa serve |
|---|---|---|---|
| Hash (SHA-256) | No, mai | No | Riconoscere se una cosa è cambiata |
| Cifratura (AES) | Sì, con la chiave | Sì | Nascondere il contenuto a chi non ce l'ha |
| Codifica (Base64) | Sì, e senza niente | No | Trasportare byte dove passa solo testo |
La confusione più diffusa è l'ultima riga: Base64 sembra illeggibile, ma è solo un altro modo di scrivere gli stessi byte e si rigira in un secondo. Non nasconde niente a nessuno.
Gli algoritmi, in ordine di quanto ci si può contare
| Algoritmo | Bit | Stato | Quando |
|---|---|---|---|
| MD5 | 128 | Rotto: collisioni in pochi secondi | Dal 2004 |
| SHA-1 | 160 | Rotto: collisione pubblicata (SHAttered) | Dal 2017 |
| SHA-256 (famiglia SHA-2) | 256 | Nessun attacco pratico. È lo standard | Dal 2001 |
| SHA-3, BLAKE2/3 | 256+ | Costruzione diversa, tenuti di riserva | Dal 2015 |
SHA-3 non è nato perché SHA-2 fosse in pericolo: è nato perché appoggiarsi a una sola famiglia matematica è imprudente. Se un giorno salta SHA-2, il ricambio è già pronto e collaudato.
Dove lo incontri, anche senza accorgertene
- Git: ogni commit è identificato dall'impronta del suo contenuto. Quel codice di sette caratteri che copi è l'inizio di un hash.
- Blockchain: ogni blocco contiene l'impronta del precedente, ed è per questo che la catena non si può riscrivere a metà. Si vede succedere in Blockchain & Mining.
- Download: sotto le immagini ISO di Linux trovi il file SHA256SUMS. È il passo 5 di questa pagina.
- Firma digitale e certificati: non si firma il documento, si firma la sua impronta — che è corta e di lunghezza fissa.
- Torrent e deduplicazione: i pezzi si riconoscono e si scartano i doppioni confrontando impronte, non contenuti.
- «La tua password è finita in una fuga di dati»: il browser manda solo le prime cinque cifre dell'impronta, riceve tutte le impronte che cominciano così e il confronto lo fa in locale. La password non parte mai, e nemmeno il suo hash intero.
Si può provare per davvero, fuori da qui
Le stesse impronte le calcola il tuo sistema operativo, senza installare niente:
Devono dare esattamente le stesse 64 cifre di questa pagina. Se non combaciano, non è l'algoritmo che è ambiguo: è che stai dando in pasto byte diversi — quasi sempre un a-capo di troppo alla fine del file.
Quando l'impronta serve a dimostrare chi ha scritto una cosa e non solo che non è cambiata, entra in gioco la chiave: continua con Il simulatore di crittografia. Se invece ti interessa vedere una catena di impronte tenere insieme un registro che nessuno può correggere, il seguito è Blockchain & Mining.
Ripetizioni e tutoring con un docente di ruolo
Matematica, fisica e informatica. Un metodo, non solo esercizi: si parte da come funziona.