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

MD5 Rotto 128 bit · 32 cifre esadecimali
Serve ancora come «numero di serie» di un file, mai per la sicurezza. Vedi il passo 4.
SHA-1 Sconsigliato 160 bit · 40 cifre esadecimali
Prima collisione pubblicata nel 2017. Git lo usa ancora, ma non per difendersi da nessuno.
SHA-256 Standard 256 bit · 64 cifre esadecimali
È quello che trovi sotto i download, dentro Bitcoin e nei certificati.

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.

Prima
Dopo —
cifre esadecimali diverse su 64. Se le due impronte non c'entrassero niente fra loro, ne aspetteremmo circa 60: una cifra su sedici si ripete per caso.
bit ribaltati su 256. Il valore atteso è 128, esattamente metà: è la firma di una funzione che rimescola bene. Cambiare un bit in ingresso ne cambia metà in uscita, e quali non è prevedibile.

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.

Impronta da forzare (SHA-256)

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.

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 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

Si può provare per davvero, fuori da qui

Le stesse impronte le calcola il tuo sistema operativo, senza installare niente:

certutil -hashfile file.zip SHA256 (Windows, prompt)
Get-FileHash file.zip (Windows, PowerShell)
sha256sum file.zip (Linux) · shasum -a 256 file.zip (macOS)

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.

Tutoring Premium

Ripetizioni e tutoring con un docente di ruolo

Matematica, fisica e informatica. Un metodo, non solo esercizi: si parte da come funziona.

Prenota il colloquio gratuito Senza impegno · Posti limitati