Federico Lelli / SchoolCrittografia

LEZIONE 07 · RICONOSCERE E VERIFICARE

Un’impronta non è una serratura

Un hash permette di calcolare un’impronta dei dati. Non è una cifratura da invertire con una chiave e non autentica da solo chi ha prodotto il messaggio.

Chi?
Chi controlla un file, chi autentica messaggi e chi progetta un sistema di login.
Che cosa?
Impronte senza chiave, controlli con chiave e derivazioni costose per password.
Quando?
Quando vuoi confrontare dati, verificare un’origine condivisa o limitare un attacco a password rubate.
Dove?
Download, protocolli applicativi e archivi delle credenziali.
Perché?
Ogni esigenza richiede una funzione diversa: non basta usare ovunque lo stesso hash veloce.

Le tre resistenze di un hash crittografico

Hash o digest
Risultato di una funzione deterministica che trasforma dati di lunghezza variabile in un’impronta di lunghezza fissa. SHA-256 restituisce 256 bit, cioè 32 byte o 64 cifre esadecimali. Deterministica significa che gli stessi byte producono sempre lo stesso risultato.
Resistenza alla preimmagine
Dato un digest, deve essere computazionalmente difficile trovare un messaggio che lo produca. Non impedisce di provare password probabili.
Resistenza alla seconda preimmagine
Dato un messaggio specifico, deve essere difficile trovarne un altro diverso con lo stesso digest.
Resistenza alle collisioni
Deve essere difficile trovare una qualsiasi coppia di messaggi distinti con lo stesso digest. Le collisioni esistono necessariamente, perché gli ingressi possibili sono più numerosi delle impronte: il requisito è la difficoltà di trovarle.
Effetto valanga
Una piccola variazione dell’ingresso cambia in modo diffuso l’uscita. È un comportamento desiderabile, ma da solo non dimostra la sicurezza della funzione.

Esempio riproducibile: esattamente tre byte

Per il testo ASCII abc, senza spazi né a capo, SHA-256 vale:

ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

Abc e abc seguito da un a capo sono ingressi diversi. Due documenti visivamente uguali possono avere metadati o codifiche differenti e dunque impronte diverse. Un digest identifica una sequenza di byte nel confronto previsto; non stabilisce che una frase sia vera o che un contratto sia valido.

Controllare un download: quale impronta è affidabile?

Se scarichi un file e un hash da una pagina compromessa, l’attaccante può sostituire entrambi. Il confronto individua errori rispetto al valore atteso soltanto se quel valore arriva attraverso un canale affidabile. Per autenticare una pubblicazione possono essere utili una firma verificata con una chiave già fidata o un canale HTTPS correttamente autenticato. MD5 e SHA-1 non sono adatti a nuovi impieghi che richiedono resistenza alle collisioni.

MAC e HMAC: aggiungere un segreto

Un MAC, Message Authentication Code, è un codice di autenticazione calcolato su un messaggio con una chiave segreta. HMAC è una costruzione standard di MAC basata su un hash, per esempio HMAC-SHA-256. Il destinatario ricalcola il valore con la stessa chiave e lo confronta. Non è equivalente a inventare una concatenazione «chiave + messaggio»: le costruzioni improvvisate possono avere vulnerabilità.

In un’interfaccia tra due servizi, un MAC può autenticare metodo, percorso, corpo, identificativo e scadenza della richiesta. Il ricevente deve anche verificare scadenza e riuso dell’identificativo per impedire il replay. Una API è l’interfaccia con cui un programma usa le operazioni offerte da un altro componente. Chiunque conosca la chiave HMAC può produrre messaggi validi: non è una firma verificabile pubblicamente. Specificazione originale di HMAC, RFC 2104.

Password: l’attaccante può indovinare in locale

Se un database contiene soltanto SHA-256(password), chi lo ruba può provare rapidamente milioni di password candidate sul proprio computer, senza contattare il servizio. È un attacco offline; bloccare i tentativi nella pagina di login non lo ferma.

Salt
Un valore casuale distinto per password memorizzata, salvato insieme al risultato. Non è segreto. Impedisce che password uguali diano gli stessi valori e rende meno riutilizzabili calcoli già eseguiti su altri utenti.
Funzione di derivazione per password
Trasforma una password e un salt in un valore usando un costo regolabile. Argon2id e scrypt consumano memoria oltre a tempo di calcolo; PBKDF2 usa iterazioni. Sono progettate per rendere costosi i tentativi, senza trasformare una password debole in un segreto casuale forte.
Pepper
Un segreto aggiuntivo, gestito separatamente dal database. Può rafforzare la protezione in alcuni modelli di minaccia, ma richiede un piano di custodia e sostituzione.

In registrazione il servizio memorizza algoritmo, parametri, salt e risultato. Al login ricalcola il risultato dalla password proposta e lo verifica usando una libreria adatta. Il recupero della password avviene con una procedura di reimpostazione, non «decifrando l’hash». OWASP indica Argon2id come scelta preferenziale quando disponibile e richiede di calibrare i parametri sul sistema. OWASP Password Storage.

Hash, HMAC o password hashing?

Per confrontare il contenuto: hash. Per autenticare tra soggetti con un segreto condiviso: MAC. Per conservare un verificatore di password: una funzione specifica con salt e costo adeguato. SHA-256 resta utile anche se è troppo veloce per essere, da solo, una buona protezione delle password.

Due utenti hanno la stessa password ma salt diversi. Il sistema è inutile?

No. I valori memorizzati saranno diversi e l’attaccante dovrà lavorare sui singoli salt. Potrà comunque provare la stessa password candidata su entrambi: il salt non impedisce di indovinare una password comune.

Approfondimento aggiunto alle trascrizioni per preparare firme e autenticazione. Calcola e confronta un hash.

Materiali didattici curati e rielaborati da Federico Lelli. Le fonti e i riferimenti specifici sono indicati nei materiali disponibili.