.net - validar - usuario y contraseña visual basic 6.0 base de datos
¿Cuál es la forma más fácil de crear y comparar una contraseña salada en.NET? (3)
Artículo de proyecto de código de Jeff Atwood:
Esta clase está muy documentada, orientada a cadenas y, sobre todo, ¡simple! Es ideal para aprender más sobre el cifrado.
En un esfuerzo continuo por mejorar mi código, estoy buscando la mejor manera de crear y comparar una contraseña salada en .NET.
¿Hay una manera mejor o más segura de hacer esto?
Mi código actual es el siguiente:
public static string CreateSaltedPassword(string salt, string password)
{
SHA1CryptoServiceProvider SHA1 = null;
SHA1 = new SHA1CryptoServiceProvider();
// Convert the string into an array of bytes
byte[] byteValue = System.Text.Encoding.UTF8.GetBytes(salt + password);
// Compute the hash value
byte[] byteHash = SHA1.ComputeHash(byteValue);
// Dispose the unmanaged cryptographic object
SHA1.Clear();
return Convert.ToBase64String(byteHash);
}
public static bool ComparePasswords(string salt, string password, string storedPassword)
{
string passwordHash = string.Empty;
// Create the hashed password
passwordHash = PasswordProvider.CreateSaltedPassword(
salt, password);
// Compare the passwords
return (string.Compare(storedPassword, passwordHash) == 0);
}
Utilice la clase Rfc2898DeriveBytes de System.Security.Cryptography
.
Está integrado en el framework .NET desde la versión 2.0 e implementa PBKDF2-HMACSHA1, lo que proporciona una sólida eliminación de contraseñas y una ralentización del hash (que es fundamental para los hash de contraseñas).
Deberías hacer algunas miles de iteraciones a través del hash SHA1:
public static string CreateSaltedPassword(string salt, string password, int iter)
{
SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider();
byte[] byteValue = System.Text.Encoding.UTF8.GetBytes(salt + password);
do {
byteValue = SHA1.ComputeHash(byteValue);
} while (--iter > 0);
SHA1.Clear();
return Convert.ToBase64String(byteValue);
}
Realice algunas pruebas para ver cuánto tiempo tarda su máquina objetivo: las iteraciones de 1000 a 10000 no deberían ser notables para los usuarios cuando se está verificando su entrada, pero cambiarán el tiempo de un atacante de horas a años, el tiempo suficiente para que la contraseña habrá expirado antes de que el atacante lo recupere.
La fuente y el tamaño de la sal no se muestran; la sal no necesita ser secreta, solo debe ser impredecible para una contraseña determinada. 8 bytes de un RNG criptográfico es una sal conveniente y segura. Los nombres de usuario son más convenientes, pero pueden ser un poco menos seguros.
Esta configuración proporciona una seguridad razonable para la mayoría de las aplicaciones de hoy. El siguiente paso en seguridad sería brypt. Cuando sugerí varias iteraciones de la función hash anterior, bcrypt hace más metódicamente con un proceso de generación de clave muy lento.
Puede que le interesen mis respuestas a estas preguntas similares: