Estoy tratando de estudiar cómo almacenar usuarios de forma segura (nombre de usuario y contraseña) en mi base de datos.
Por lo que he recopilado en mi investigación, la forma más segura de almacenar una contraseña es:
Encontré la clase Rfc2898DeriveBytes que me permite hacer eso, pero ahora no estoy seguro de cómo almacenar todos los datos en mi base de datos, mi pregunta es ¿cómo voy a iniciar sesión si la contraseña cifrada siempre es diferente?
Rfc2898DeriveBytes genera una clave, pero estoy bastante seguro de que no debo guardar la clave en la base de datos, no sé qué hacer :(
Por ahora esto es lo que escribí/reuní:
public static byte[] GetSalt(int maximumLenght) { byte[] salt = new byte[maximumLenght]; using (var random = new RNGCryptoServiceProvider()) { random.GetNonZeroBytes(salt); } return salt; } public byte[] GenerateSaltedHash(byte[] password, byte[] salt) { byte[] concatenatedSalt = new byte[salt.Length + password.Length]; concatenatedSalt = salt.Concat(password).ToArray(); return settings.HashAlgorithmType.ComputeHash(concatenatedSalt); } public static byte[] HashPassword(byte[] password, byte[] salt, int iterations) { using (var rfc2898 = new Rfc2898DeriveBytes(password, salt, iterations)) { //dunno to do with that return rfc2898.GetBytes(32); } }¿Debo almacenar el recuento de iteraciones, la sal y el hash? ¿Es seguro hacer eso?