Che cosa fa una funzione hash
Una funzione hash trasforma un input di lunghezza arbitraria in un digest di lunghezza fissa. È deterministica: lo stesso input produce lo stesso digest, mentre una piccola modifica dovrebbe cambiare ampiamente il risultato in una funzione crittografica ben progettata.
Il digest è una rappresentazione derivata, non una versione compressa da cui ricostruire il messaggio. La proprietà one-way è fondamentale per molti usi di integrità, firma e identificazione di contenuti.
Preimage, second preimage e collisioni
La sicurezza viene descritta con proprietà diverse: resistenza alla preimage, alla second preimage e alle collisioni. Una collisione esiste quando due input differenti producono lo stesso digest; per un hash da n bit la ricerca generica di collisioni segue circa il birthday bound di 2^(n/2).
Per questo la lunghezza del digest e lo stato della crittoanalisi contano. MD5 e SHA-1 non sono più adatti quando serve resistenza crittografica alle collisioni, anche se possono comparire in sistemi legacy o checksum non avversariali.
Famiglia SHA e scelta dell'algoritmo
SHA-256 e SHA-512 appartengono a SHA-2 e restano scelte comuni per integrità e molti protocolli. SHA-3 usa una costruzione diversa e offre un'alternativa standardizzata con proprietà interne differenti.
La scelta non dipende soltanto dal numero di bit: conta il protocollo, l'interoperabilità, la disponibilità di librerie affidabili e l'obiettivo di sicurezza. Evita algoritmi proprietari o combinazioni non standard senza analisi specifica.
Hash, checksum e HMAC
Un hash non autenticato può rilevare modifiche accidentali solo se il digest atteso arriva da un canale fidato. Un attaccante che può cambiare sia dati sia digest può semplicemente ricalcolare l'hash.
HMAC combina una funzione hash con una chiave segreta e fornisce autenticità e integrità del messaggio tra parti che condividono la chiave. Un checksum tradizionale, invece, è progettato soprattutto per errori accidentali e non per resistere a un avversario.
Password: perché un hash veloce non basta
Le password hanno bassa entropia e possono essere provate offline. Funzioni veloci come SHA-256 permettono miliardi di tentativi e non sono quindi una scelta adeguata per memorizzare password, neppure aggiungendo un semplice salt.
Si usano password hashing function adattive e costose come Argon2id, scrypt o bcrypt, con salt unici e parametri di costo calibrati. Il salt contrasta tabelle precompute ma non sostituisce il costo computazionale.
Hashing e cifratura non sono la stessa cosa
La cifratura è reversibile con una chiave e mira alla confidenzialità. L'hashing non usa una chiave per poter recuperare il messaggio e viene usato per proprietà diverse, come fingerprint e integrità.
Scegli la primitiva in base alla minaccia: cifratura autenticata per proteggere dati leggibili solo da soggetti autorizzati, HMAC per autenticare messaggi con segreto condiviso, password hashing per credenziali e hash crittografico per digest pubblici.