Me pregunto qué piensan todos los expertos en seguridad de mi método para el hashing de contraseñas. Quiero encontrar un método que pueda usar para todos mis futuros proyectos de desarrollo web.
Primero creo una sal aleatoria basada en una matriz de 32 bytes:
RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider();
byte[] randomNumber = new byte[32];
provider.GetBytes(randomNumber);
string salt = System.Text.Encoding.UTF8.GetString(randomNumber);
Luego almacenaría esa sal en la fila de la base de datos del usuario.
Para codificar la contraseña, usaría:
// 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);
}
Los métodos EncryptStringToBytes y DecryptStringFromBytes se pueden ver aquí: link
Si alguien pudiera ver esto y hacerme saber sobre cualquier vulnerabilidad o lugar donde pudiera fortalecerlo, ¡lo apreciaría enormemente! Gracias!
Editar
He implementado una versión de BCrypt aquí:
string myPassword = "password";
string mySalt = BCrypt.GenerateSalt();
string myHash = BCrypt.HashPassword(myPassword, mySalt);