Sto sostituendo un sistema di memorizzazione delle password. L'implementazione corrente utilizza TripleDES con la chiave memorizzata in testo in chiaro nei file binari e nella configurazione (nel caso in cui uno di essi non sia disponibile per qualche motivo (DSTM)), l'applicazione decodifica il valore dal database e lo confronta con il valore di testo semplice inviato dal client.
Sto proponendo di sostituire questo con BCrypt (in questo caso, BCrypt.Net). Io uso il seguente codice come esempio
int workFactor = ((DateTime.Now.Year - 2000) / 2) + 6;
string salt = BCrypt.Net.BCrypt.GenerateSalt(workFactor);
Console.WriteLine("Salt: " + salt);
string password = "some test password";
string passwordHash = BCrypt.Net.BCrypt.HashPassword(password, salt);
Console.WriteLine("PW: " + passwordHash);
Console.WriteLine("Verify: " + BCrypt.Net.BCrypt.Verify(password, passwordHash));
Un risultato potrebbe essere
Salt: $2a$14$zhJH43uFxZU3FJ9FaFQusO
PW: $2a$14$zhJH43uFxZU3FJ9FaFQusOn7bJTsXZQgXpEGYFBIygd.8lGXIcc22
Verify: True
Ho notato che non c'era alcun separatore tra il valore salt e il valore della password, quando Verify
ha restituito true
quando non ho specificato un salt.
Se il sale è incluso nell'output della password hash, c'è qualche valore nella memorizzazione di $2a$14$zhJH43uFxZU3FJ9FaFQusO
e $2a$14$zhJH43uFxZU3FJ9FaFQusOn7bJTsXZQgXpEGYFBIygd.8lGXIcc22
separatamente?
Immagino che probabilmente vorrei generare un nuovo salt per l'utente la prossima volta che selezionano comunque una password.