Cos'è una funzione hash?
Una funzione hash trasforma un input di qualsiasi dimensione in una stringa di lunghezza fissa chiamata digest o checksum. Le proprietà fondamentali sono: determinismo (lo stesso input produce sempre lo stesso hash), velocità, effetto valanga (un minimo cambiamento nell'input cambia radicalmente l'output), e irreversibilità (non si può risalire all'input dal digest).
Confronto tra algoritmi
- MD5 (128 bit): veloce ma non sicuro — vulnerabile a collisioni dal 2004. Va usato solo per checksum di file, mai per password
- SHA-1 (160 bit): deprecato dal 2017 dopo che Google ha dimostrato una collisione pratica (progetto SHAttered). Non più accettato per certificati SSL
- SHA-256 (256 bit): parte della famiglia SHA-2, è lo standard attuale. Usato in Bitcoin, certificati TLS, firme digitali. Nessuna collisione nota
- SHA-512 (512 bit): più sicuro e paradossalmente spesso più veloce di SHA-256 su processori a 64 bit
- SHA-3 (Keccak): standard NIST dal 2015, basato su un design completamente diverso (sponge construction). È il "piano B" nel caso SHA-2 venisse compromesso
Casi d'uso comuni
- Verifica integrità file: i siti di download forniscono l'hash SHA-256 per verificare che il file non sia stato alterato
- Archiviazione password: le password non vengono mai salvate in chiaro, ma come hash (con salt). Algoritmi dedicati come bcrypt o Argon2 sono preferiti perché volutamente lenti
- Blockchain: Bitcoin usa il doppio SHA-256 per collegare i blocchi in una catena immutabile
- Git: ogni commit è identificato dal suo hash SHA-1 (migrazione a SHA-256 in corso)
- Firma digitale: si firma l'hash del documento anziché il documento intero, per efficienza
Hash e sicurezza
Una collisione si verifica quando due input diversi producono lo stesso hash. Per SHA-256 con i suoi 2²⁵⁶ possibili output, trovare una collisione per forza bruta richiederebbe circa 2¹²⁸ tentativi — ben oltre le capacità computazionali attuali. Questo strumento calcola l'hash interamente nel browser usando la Web Crypto API: nessun dato viene inviato a server esterni.