Perché non semplicemente SHA-256?
Un normale hash crittografico come è lo strumento giusto per l'integrità, ma lo strumento sbagliato per memorizzare le password, e il motivo è proprio la proprietà che lo rende buono altrove: è veloce. Un attaccante che ruba un database di hash SHA-256 di password può tentare miliardi di ipotesi al secondo su hardware comune, perché ogni ipotesi è solo un hash veloce. Le password comuni cadono quasi istantaneamente. La velocità, la virtù di un hash generico, qui è uno svantaggio.
La memorizzazione delle password richiede un hash deliberatamente lento e resistente all'hardware specializzato. Tre blocchi costitutivi lo rendono possibile: il salting, un fattore di lavoro regolabile e la durezza di memoria.
Salting: sconfiggere il precalcolo
Un sale (salt) è un valore casuale univoco memorizzato accanto a ciascun hash di password e mescolato nel processo di hashing. Senza sali, password identiche producono hash identici, quindi un attaccante può precalcolare una tabella gigante di hash di password comuni una volta sola (una "rainbow table") e cercare ogni corrispondenza istantaneamente. Un sale univoco per password rende inutile quel precalcolo: l'attaccante deve attaccare ogni hash individualmente, e la stessa password genera un hash diverso per ogni utente. Le moderne funzioni di hashing delle password generano e memorizzano il sale per te.
Fattore di lavoro: rendere costosa ogni ipotesi
Un fattore di lavoro (o parametro di costo) controlla quanta computazione richiede ogni hash. Impostalo così che un singolo hash sia abbastanza lento da essere impercettibile per un login legittimo (qualche centinaio di millisecondi) ma punitivo su larga scala. Essendo un parametro, puoi alzarlo nel corso degli anni man mano che l'hardware accelera, mantenendo il costo del tentativo all'incirca costante. Questa è la manopola che un hash generico semplicemente non ha.
Le tre scelte standard
- bcrypt è l'opzione consolidata e ben compresa, costruita sul cifrario Blowfish con un fattore di costo configurabile. Un valore predefinito sicuro dove disponibile.
- scrypt aggiunge la durezza di memoria: consuma deliberatamente una quantità regolabile di memoria, il che ostacola gli attaccanti che usano GPU e chip personalizzati, poiché questi scalano la computazione molto più a buon mercato della memoria.
- Argon2 ha vinto la Password Hashing Competition nel 2015 ed è la raccomandazione attuale per i nuovi sistemi. È a memoria dura, con manopole separate per memoria, tempo e parallelismo; la variante Argon2id è la scelta abituale.
Una qualsiasi di queste è una scelta ragionevole; la regola cardine è usarne una, mai un semplice hash veloce, e mai inventare il proprio schema.
La conclusione
Usa SHA-256 (nello strumento Hash) per checksum e integrità, dove la velocità è un pregio. Per le password, ricorri a bcrypt, scrypt o Argon2, dove la lentezza e il costo di memoria sono tutto il punto. I due compiti sembrano simili e richiedono strumenti opposti.