Mi sto solo chiedendo cosa pensano gli esperti di sicurezza del mio metodo per l'hashing delle password. Voglio proporre un metodo che possa essere utilizzato per tutti i miei futuri progetti di sviluppo web.
Per prima cosa creo un sale casuale basato su un array a 32 byte:
RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider();
byte[] randomNumber = new byte[32];
provider.GetBytes(randomNumber);
string salt = System.Text.Encoding.UTF8.GetString(randomNumber);
Quindi lo memorizzerei nella riga del database dell'utente.
Per cancellare la password, vorrei usare:
// Create a new instance of the RijndaelManaged
// class. This generates a new key and initialization
// vector (IV).
using (RijndaelManaged myRijndael = new RijndaelManaged())
{
myRijndael.GenerateKey();
myRijndael.GenerateIV();
// Encrypt the string to an array of bytes.
byte[] encrypted = EncryptStringToBytes(salt + password, myRijndael.Key, myRijndael.IV);
string encryptedPassword = System.Text.Encoding.UTF8.GetString(encrypted);
}
I metodi EncryptStringToBytes e DecryptStringFromBytes possono essere visualizzati qui: link
Se qualcuno potesse esaminare questo aspetto e farmi conoscere eventuali vulnerabilità o luoghi in cui potrei rafforzarlo, lo apprezzerei molto! Grazie!
Modifica
Ho implementato una versione di BCrypt qui:
string myPassword = "password";
string mySalt = BCrypt.GenerateSalt();
string myHash = BCrypt.HashPassword(myPassword, mySalt);