Tutti gli articoli

Bcrypt: perché le password vengono hashate lentamente, non velocemente

Un hash bcrypt ha sempre una struttura leggibile, se si sa dove guardare: $2y$12$ indica la versione dell'algoritmo e il cost factor, seguito da 22 caratteri che codificano il sale a 128 bit e infine 31 caratteri che codificano l'hash vero e proprio a 184 bit — per un totale fisso di 60 caratteri, indipendentemente dalla lunghezza della password originale. Questo formato compatto è il motivo per cui bcrypt è così comodo da salvare in una colonna di database: basta una stringa VARCHAR(60).

Perché la velocità danneggia la sicurezza delle password

Se un attaccante ruba un database di hash di password, cerca di recuperare la password originale con la forza bruta. Con una funzione veloce come SHA-256, l'hardware moderno può verificare miliardi di combinazioni al secondo. Bcrypt fa in modo che un singolo hashing richieda deliberatamente circa 100 millisecondi, rendendo la forza bruta ordini di grandezza più lenta e costosa.

Cos'è il cost factor

Il parametro "cost" di bcrypt fissa il numero di round interni come potenza di due (2^cost, tipicamente 10-12) — è il primo numero che compare subito dopo il prefisso di versione nell'hash. Aumentarlo di uno raddoppia circa il tempo per hash, e raddoppia altrettanto il costo totale di un attacco a forza bruta.

Sale integrato

Bcrypt genera automaticamente un sale casuale unico per ogni password e lo integra direttamente nei 22 caratteri centrali del risultato — non c'è nulla da salvare separatamente. Due password identiche producono hash diversi, e le rainbow table precalcolate per le password comuni diventano inutili: ogni hash va attaccato individualmente.

A cosa serve

  • Memorizzare correttamente le password degli utenti nel database di un'applicazione.
  • Capire perché SHA-256 o MD5 sono una cattiva scelta per l'hashing delle password.
  • Testare o migrare un sistema di autenticazione che usa bcrypt, verificando anche la lunghezza fissa della colonna nel database.

Il limite nascosto: 72 byte

Bcrypt elabora solo i primi 72 byte della password — tutto ciò che è più lungo viene scartato silenziosamente, senza avviso. In pratica questo è raramente un problema per le password in italiano (72 caratteri ASCII sono già moltissimi), ma vale la pena conoscere questo limite quando si definisce la lunghezza massima di un campo password in un modulo di registrazione.

Prova lo strumento