Una funzione hash crittografica è una funzione matematica che mappa un input di lunghezza arbitraria in un output di lunghezza fissa detto digest (o impronta digitale):
La funzione è deterministica: lo stesso input produce sempre lo stesso digest. È progettata per essere one-way: dato il digest, è computazionalmente impossibile risalire all’input. Si distingue da un semplice checksum (CRC32, MD5 non crittografico) per tre proprietà di sicurezza formali che rendono impossibili specifiche classi di attacchi.
Le tre proprietà crittografiche
La pre-image resistance (unidirezionalità) garantisce che dato un digest sia impossibile trovare un input tale che . Fonda la sicurezza dell’archiviazione degli hash delle password: anche con il database in mano, l’attaccante non può risalire alle password originali.
La second pre-image resistance garantisce che dato un input sia impossibile trovare un con lo stesso digest. Impedisce che un attaccante sostituisca un documento firmato con uno diverso avente la stessa impronta.
La collision resistance garantisce che sia impossibile trovare una qualsiasi coppia con e . Per il paradosso del compleanno, trovare collisioni richiede operazioni — per SHA-256 equivale a , ancora irraggiungibile.
Algoritmi
SHA-256 e SHA-512 (famiglia SHA-2, costruzione Merkle-Damgård) sono lo standard universale corrente. SHA-3 (Keccak, costruzione sponge) è l’alternativa strutturalmente diversa standardizzata dal NIST nel 2015, immune all’attacco length extension che affligge Merkle-Damgård. MD5 e SHA-1 sono crittograficamente rotti — le loro collisioni si calcolano in secondi su hardware comune — e non devono essere usati per scopi crittografici.
Applicazioni
Le funzioni hash sono primitive trasversali a tutta la sicurezza informatica. Nell’archiviazione delle password si usano funzioni di derivazione lente con salt (Argon2id, bcrypt) che introducono un costo computazionale intenzionalmente alto per rendere il brute force impraticabile. Nell’HMAC (Hash-based Message Authentication Code) la hash viene combinata con una chiave segreta per garantire simultaneamente integrità e autenticità. Nelle firme digitali il firmatario calcola e lo cifra con la propria chiave privata: la verifica confronta il digest decifrato con ricalcolato. Negli alberi di Merkle ogni nodo interno contiene l’hash dei propri figli: permettono la verifica dell’appartenenza di un elemento a un insieme con soli hash, base tecnica di Bitcoin, Git e dei sistemi di file distribuiti.