Hash di una Password
Come funziona l'hash delle password: MD5, SHA-256, bcrypt e Argon2 a confronto, salt, rainbow table e perché la scelta dell'algoritmo è critica.

Quando crei un account su un sito e scegli una password, quella password non viene salvata nel database così com'è. Se lo fosse, basterebbe una singola violazione del database per esporre le credenziali di tutti gli utenti. Invece, viene applicata una funzione matematica chiamata hash che trasforma la password in una stringa irriconoscibile. Ma non tutti gli hash sono uguali — e la differenza tra un hash debole e uno forte può fare la differenza tra password sicure e password craccabili in pochi minuti.
Cos'è una funzione hash?
Una funzione hash prende un input di qualsiasi lunghezza e produce un output di lunghezza fissa, chiamato digest o hash. Le proprietà fondamentali che rendono le funzioni hash utili per la sicurezza:
Deterministica: lo stesso input produce sempre lo stesso hash. hash("ciao") = abc123... ogni volta.
Unidirezionale: dall'hash non puoi risalire all'input originale (in teoria — vedremo le eccezioni). Non è come una cifratura, non c'è una "chiave" per decifrare.
Effetto valanga: anche una minima variazione nell'input cambia completamente l'hash. hash("ciao") e hash("ciau") producono digest totalmente diversi.
Resistenza alle collisioni: è computazionalmente impossibile trovare due input diversi che producono lo stesso hash (con gli algoritmi moderni).
Esempio pratico: SHA-256 in azione
Proviamo con SHA-256 — uno degli algoritmi più usati oggi:
-
Input:
password123 -
Hash:
ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94f -
Input:
password124(un solo carattere diverso) -
Hash:
5a0e61b3b32e8a45ecdb50c06d5c1a38a9a6474e7f9e895fc3da5af3e9ad3e26
I due hash non hanno niente in comune visivamente, pur provenendo da input quasi identici. Questo è l'effetto valanga.
Puoi provarlo direttamente con il nostro calcolatore di hash che supporta MD5, SHA-1, SHA-256 e SHA-512.
Come i siti salvano le password
Il flusso corretto per la gestione delle password in un sistema moderno:
Registrazione
- Utente inserisce la password:
MiaPassword2024! - Il server genera un salt — una stringa casuale univoca, es:
7f3a9c2b - Il server combina password + salt:
MiaPassword2024!7f3a9c2b - Applica un algoritmo lento (bcrypt, Argon2, ecc.) ottenendo l'hash
- Salva nel database: salt + hash (non la password!)
Login
- Utente inserisce la password
- Il server recupera il salt dell'utente dal database
- Combina password inserita + salt e calcola l'hash
- Confronta con l'hash salvato
- Se corrispondono → accesso consentito
La password reale non viene mai salvata e non viene mai inviata in chiaro dopo la registrazione.
Gli algoritmi: non tutti sono uguali
MD5 e SHA-1: da evitare per le password
MD5 è rapido — velocissimo. Una GPU moderna può calcolare miliardi di hash MD5 al secondo. Questo lo rende completamente inadeguato per proteggere le password: un attaccante può provare miliardi di combinazioni al secondo.
SHA-1 ha gli stessi problemi di velocità, più vulnerabilità crittografiche note. Usato ancora per verifiche di integrità dei file, ma mai per password.
SHA-256 e SHA-512 sono sicuri crittograficamente ma rimangono veloci — stesso problema di MD5 per le password. Sono ottimi per firme digitali, certificati e integrità dei file, ma non per l'hashing delle password.
bcrypt: lo standard storico
bcrypt è stato progettato nel 1999 specificamente per l'hashing delle password, con un principio rivoluzionario: essere lento per design. Include un parametro di "cost factor" che determina quante iterazioni eseguire. Aumentandolo, il tempo per generare un hash cresce esponenzialmente.
Con cost factor 12 (comune nelle applicazioni moderne), calcolare un singolo hash bcrypt richiede ~300ms. Sembra poco, ma significa che un attaccante può provare solo ~3 password al secondo invece di miliardi. La stessa GPU che cracca miliardi di MD5 al secondo ne cracca appena qualche migliaio di bcrypt.
Argon2: lo stato dell'arte
Argon2 ha vinto il Password Hashing Competition nel 2015 ed è oggi considerato l'algoritmo raccomandato per le nuove implementazioni. Ha tre varianti:
- Argon2i: ottimizzato contro attacchi side-channel
- Argon2d: ottimizzato contro attacchi GPU
- Argon2id: ibrido, la variante raccomandata per la maggior parte dei casi
A differenza di bcrypt, Argon2 permette di configurare sia il tempo di calcolo che la memoria richiesta. Richiedere 1GB di RAM per calcolare un hash rende impossibile eseguire attacchi paralleli su GPU (che hanno memoria limitata per thread).
PBKDF2: il più compatibile
PBKDF2 è il più vecchio algoritmo "lento" ancora accettabile — usato da iOS per il keychain e da molti sistemi enterprise. Non è considerato all'avanguardia come Argon2 ma è ampiamente supportato e sufficientemente sicuro con parametri appropriati.
Attacchi agli hash: come funzionano nella realtà
Rainbow tables
Le rainbow table sono database precalcolati che associano hash a password note. Prima dell'uso del salt, erano devastanti: cerchi l'hash nel database e trovi subito la password.
Il salt le rende inutili: poiché ogni password ha un salt diverso e casuale, non puoi precalcolare niente. L'attaccante deve calcolare l'hash per ogni tentativo includendo il salt specifico dell'utente.
Brute force e dictionary attack
Con hash veloci (MD5, SHA-256 senza iterazioni), un attaccante con hardware moderno:
- Prova tutte le password di 8 caratteri in poche ore
- Prova milioni di password da dizionario in secondi
Con bcrypt o Argon2 con parametri corretti:
- Una singola GPU ci metterebbe decenni per trovare una password di 12 caratteri complessa
- Gli attacchi diventano economicamente non fattibili
Credential stuffing
Quando un database viene rubato con hash deboli (MD5), gli attaccanti craccano gli hash e usano le credenziali su tutti gli altri servizi (dove molti utenti riusano le password). Per questo il tipo di hash usato da ogni sito che usi ha un impatto diretto sulla tua sicurezza su tutti gli altri siti.
Verifica il tuo sito: usa hash moderni?
Puoi fare una verifica empirica: quando fai il login su un sito, se ricevi la tua password via email "per recuperarla", significa che la salva in chiaro o cifrata (reversibilmente) — non in hash. Segnale di allarme.
Un'altra verifica: se fai "password dimenticata" e il sito ti manda la vecchia password (non un link per reimpostarla), è un problema grave. Con hash corretti, nessuno può sapere la tua password originale — può solo permetterti di impostarne una nuova.
Domande frequenti
Posso usare SHA-256 per le password della mia applicazione? Non direttamente. SHA-256 è troppo veloce per proteggere le password. Usa bcrypt con cost factor ≥ 12, oppure Argon2id. Framework come Django, Laravel, Rails e Node.js (Passport) usano bcrypt o Argon2 di default.
Qual è la differenza tra hash e cifratura? La cifratura è reversibile con la chiave giusta: cifri e poi decifri. L'hash è irreversibile: non c'è chiave, non puoi ottenere l'originale. Per le password si usa l'hash proprio perché non serve mai "vedere" la password originale — si verifica sempre per confronto di hash.
Se due utenti hanno la stessa password, hanno lo stesso hash?
Con il salt, no. Anche se due utenti scelgono password123, i loro salt casuali sono diversi, quindi i loro hash sono completamente diversi. Senza salt, sì — e questo permetteva di identificare facilmente le password comuni in un database rubato.
← Tutti gli articoli
