BCrypt è stato ben progettato e ci sono state molte riflessioni sul suo funzionamento. C'è un'impostazione speciale inclusa chiamata fattore di lavoro per aggiungere lavoro quando l'utente malintenzionato tenta di decifrare la password.
Queste due soluzioni richiedono lo stesso tempo per il calcolo.
bcrypt(15, bcrypt(15, bcrypt(15, bcrypt(15, "password"))))
bcrypt(17, "password")
(il fattore di lavoro 16 impiega il doppio del tempo di 15 e il 17 richiede quattro volte il tempo di 15)
Non c'è niente da guadagnare nel complicare la procedura del codice. Basta scegliere il fattore di lavoro ideale. Di solito suggerisco di regolare il fattore di lavoro in modo che occorra ~ 100ms per completare (con la protezione DoS bruta appropriata) sull'hardware di destinazione. (notando che l'hardware dell'attaccante sarebbe probabilmente più veloce)
Se stai cercando dei modi per migliorarlo, ti suggerirei di Pepper in attesa prima della password. Pepper è semplicemente una stringa casuale che non è memorizzata con l'hash stesso. È possibile eseguire l'hard-code del pepe nell'applicazione o salvarlo in un file di testo separato. (non nel database) Raccomando di usare un peperone con 72-bit di entropia. (12 caratteri Base64 o 18 caratteri esadecimali)
Poiché BCrypt ha una lunghezza massima di 55-56 byte , potrebbe essere saggio prima eseguire un hash SHA-256 su Pepper e Password, per ottenere una stringa esadecimale di 32 caratteri, che si adatta perfettamente a BCrypt. (altrimenti, supponendo di aver usato un pepe di 12 caratteri, qualsiasi carattere oltre la password di 43 byte sarebbe troncato) Grazie a @Walfrat .