Cos'è una funzione hash crittografica
Una funzione hash crittografica è un algoritmo che trasforma un input di lunghezza arbitraria in un output di lunghezza fissa (il digest o hash). Deve soddisfare tre proprietà fondamentali: determinismo (stesso input → sempre stesso output), efficienza (calcolo veloce) e resistenza all'inversione (impossibile risalire all'input dall'output).
SHA-256: le caratteristiche
SHA-256 (Secure Hash Algorithm 256) fa parte della famiglia SHA-2 progettata dalla NSA e standardizzata dal NIST nel 2001. Produce un digest di 256 bit (64 caratteri esadecimali). È computazionalmente infeasible trovare due input diversi con lo stesso hash (resistenza alle collisioni), rendendo SHA-256 adatto per applicazioni di sicurezza.
Esempio: SHA-256 di "hello" = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 (sempre lo stesso, indipendentemente dal sistema).
SHA-256 vs MD5 vs SHA-1
- MD5 (128 bit): veloce ma collisioni note dal 2004; non usare per sicurezza
- SHA-1 (160 bit): collisioni pratiche dimostrate nel 2017 (SHAttered attack); deprecato
- SHA-256 (256 bit): nessuna collisione pratica nota; standard attuale per la sicurezza
- SHA-3 (256/384/512 bit): famiglia alternativa basata su Keccak; backup se SHA-2 fosse compromesso
Casi d'uso principali
- Verifica integrità file: il hash del file scaricato deve corrispondere a quello pubblicato
- Blockchain: ogni blocco contiene il hash del blocco precedente, creando una catena immutabile
- Firma digitale: il documento viene hashato e poi il hash viene firmato con la chiave privata
- Derivazione chiavi: PBKDF2, bcrypt, Argon2 usano hash ripetuti per rallentare gli attacchi bruteforce
- HMAC: Message Authentication Code per verificare autenticità e integrità dei messaggi API
Hash per le password: non usare SHA-256 diretto
SHA-256 è troppo veloce per hashare le password: un attaccante con GPU moderna può provare miliardi di hash al secondo (brute force / rainbow table). Per le password usa sempre algoritmi lenti e con salt: bcrypt (work factor ≥ 12), Argon2id o scrypt. Questi sono progettati specificamente per rendere il brute force economicamente non conveniente.