Quando ti registri su un sito serio, accade una cosa che forse non immagini: il sito non conserva la tua password. Non la conosce, non può leggerla, non potrebbe rispedirtela nemmeno volendo. Sembra un paradosso, ma è la base della sicurezza degli account. Vediamo come funziona.
Hash non è cifratura
La password non viene "cifrata" (operazione reversibile), ma trasformata con una funzione di hash: un calcolo a senso unico che produce una stringa irriconoscibile e non reversibile. Dall'hash non si può risalire alla password originale.
Perché bcrypt
bcrypt è uno degli algoritmi standard per questo scopo. Ha due qualità chiave: aggiunge un "sale" (un dato casuale unico per ogni utente, così due password uguali producono hash diversi) ed è volutamente lento, per rendere antieconomico provare miliardi di combinazioni.
const hash = await bcrypt.hash(password, 12);
// nel database finisce solo l'hash, mai la password
"Zero-knowledge": il sito non sa la tua password
Al login il sistema applica lo stesso calcolo alla password inserita e confronta gli hash. Se combaciano, sei tu — senza che la password sia mai stata memorizzata in chiaro. È il principio "zero-knowledge".
Tarare il cost factor
La forza di bcrypt sta nel parametro di costo, che va scelto sull'hardware di produzione: un valore che tiene la verifica intorno ai 250-300 millisecondi resta impercettibile all'utente e rende il brute force enormemente costoso. Va rivisto nel tempo, perché l'hardware degli attaccanti migliora. Due dettagli spesso ignorati: bcrypt considera solo i primi 72 byte della password, e per progetti nuovi Argon2id è oggi la scelta preferibile.
Leggi anche: password mai in chiaro e confronti a tempo costante.