Cos'è una funzione hash?
Una funzione hash è un algoritmo che trasforma un input di qualsiasi lunghezza in un output di lunghezza fissa, chiamato hash, digest o checksum. Le proprietà fondamentali sono:
- Deterministica: lo stesso input produce sempre lo stesso output
- Irreversibile: dall'hash non si può (in teoria) risalire all'input originale
- Effetto valanga: un piccolo cambiamento nell'input cambia completamente l'hash
- Resistenza alle collisioni: deve essere computazionalmente impossibile trovare due input diversi con lo stesso hash
Confronto tra gli algoritmi principali
| Algoritmo | Lunghezza hash | Sicurezza | Uso consigliato |
|---|---|---|---|
| MD5 | 128 bit (32 hex) | ❌ Rotto | Solo checksum non critici |
| SHA-1 | 160 bit (40 hex) | ⚠️ Deprecato | Da evitare per nuovi sistemi |
| SHA-256 | 256 bit (64 hex) | ✅ Sicuro | Firme digitali, integrità file |
| SHA-512 | 512 bit (128 hex) | ✅ Molto sicuro | Alta sicurezza, certificati |
| bcrypt | variabile | ✅ Ottimo | Solo per password |
MD5: ancora utile ma non sicuro
MD5 (Message Digest 5) è stato progettato nel 1991 da Ron Rivest. Per anni è stato lo standard per verificare l'integrità dei file. Oggi è crittograficamente rotto: nel 2004 sono state dimostrate collisioni intenzionali, e nel 2008 sono stati falsificati certificati SSL usando MD5.
È ancora accettabile per verificare che un file non sia corrotto durante il download (checksum), quando non c'è un attaccante motivato a manipolare i dati. Non deve mai essere usato per password o firme digitali.
SHA-1: deprecato ma ancora presente
SHA-1 (Secure Hash Algorithm 1) produce un hash da 160 bit. Nel 2017 Google ha dimostrato la prima collisione pratica (progetto SHAttered). Chrome e Firefox hanno smesso di accettare certificati SSL SHA-1 dal 2017. Se stai ancora usando SHA-1, è ora di migrare a SHA-256.
SHA-256 e SHA-512: lo standard attuale
SHA-256 fa parte della famiglia SHA-2, progettata dalla NSA nel 2001. Con 256 bit di output, nessuna collisione pratica è stata trovata. È usato in Bitcoin, nelle firme di software, nei certificati TLS moderni e in innumerevoli protocolli di sicurezza. SHA-512 offre ancora più sicurezza con output da 512 bit.
Hash per le password: non usare MD5 o SHA
Questo è il punto più importante: MD5 e SHA non sono adatti per proteggere password, anche se usati con un salt. Sono troppo veloci: un attaccante moderno può tentare miliardi di hash al secondo con una GPU comune.
Per le password usa algoritmi specifici:
- bcrypt: introduce un "work factor" configurabile che rallenta il calcolo proporzionalmente
- scrypt: richiede anche molta memoria, non solo CPU
- Argon2: vincitore della Password Hashing Competition 2015, lo stato dell'arte attuale
- PBKDF2: richiesto da alcuni standard FIPS, disponibile ovunque
Usi pratici dell'hashing
- Verifica integrità file: confronti l'hash del file scaricato con quello pubblicato dall'autore
- Firme digitali: il documento viene hashato e l'hash viene firmato con la chiave privata
- Deduplicazione: confrontare hash è molto più veloce che confrontare file interi
- Strutture dati: hash table, Merkle tree (usati in Git e blockchain)
- Fingerprinting: identificare univocamente un file o un dato
FAQ
In teoria no: gli algoritmi di hash sono funzioni a senso unico. In pratica, per hash deboli come MD5 su password comuni, esistono database di hash precalcolati (rainbow tables) che permettono di risalire al testo originale.
No, non per scopi crittografici. MD5 è vulnerabile alle collisioni ed è stato rotto nel 2004. È ancora accettabile per checksum non critici, ma non deve mai essere usato per password o firme digitali.
Usa algoritmi progettati appositamente: bcrypt, scrypt, Argon2 o PBKDF2. Questi sono intenzionalmente lenti e includono un salt per resistere agli attacchi a dizionario.
Una collisione si verifica quando due input diversi producono lo stesso valore hash. Per un buon algoritmo crittografico, trovare una collisione deve essere computazionalmente impossibile. MD5 e SHA-1 sono vulnerabili a collisioni intenzionali.