Contraseñas hash en ASP.NET Core
La base de código de protección de datos incluye un paquete Microsoft.AspNetCore.Cryptography.KeyDerivation que contiene funciones de derivación de claves criptográficas. Este paquete es un componente independiente y no tiene dependencias en el resto del sistema de protección de datos. Se puede usar de forma completamente independiente. El origen existe junto con la base de código de protección de datos para mayor comodidad.
Actualmente, el paquete ofrece un método KeyDerivation.Pbkdf2 que permite el algoritmo hash de una contraseña mediante el algoritmo PBKDF2. Esta API es muy similar al tipo rfc2898DeriveBytesexistente de .NET Framework, pero hay tres diferencias importantes:
El
KeyDerivation.Pbkdf2método admite el consumo de varias PRF (actualmente , y ), mientras queHMACSHA1el tipo solo admiteHMACSHA256HMACSHA512Rfc2898DeriveBytesHMACSHA1.El método detecta el sistema operativo actual e intenta elegir la implementación más optimizada de la rutina, lo que proporciona un rendimiento mucho mejor
KeyDerivation.Pbkdf2en determinados casos. (En Windows 8, ofrece aproximadamente 10 veces el rendimiento deRfc2898DeriveBytes).El
KeyDerivation.Pbkdf2método requiere que el autor de la llamada especifique todos los parámetros (salt, PRF y recuento de iteraciones). ElRfc2898DeriveBytestipo proporciona valores predeterminados para estos.
using System;
using System.Security.Cryptography;
using Microsoft.AspNetCore.Cryptography.KeyDerivation;
public class Program
{
public static void Main(string[] args)
{
Console.Write("Enter a password: ");
string password = Console.ReadLine();
// generate a 128-bit salt using a cryptographically strong random sequence of nonzero values
byte[] salt = new byte[128 / 8];
using (var rngCsp = new RNGCryptoServiceProvider())
{
rngCsp.GetNonZeroBytes(salt);
}
Console.WriteLine($"Salt: {Convert.ToBase64String(salt)}");
// derive a 256-bit subkey (use HMACSHA256 with 100,000 iterations)
string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password,
salt: salt,
prf: KeyDerivationPrf.HMACSHA256,
iterationCount: 100000,
numBytesRequested: 256 / 8));
Console.WriteLine($"Hashed: {hashed}");
}
}
/*
* SAMPLE OUTPUT
*
* Enter a password: Xtw9NMgx
* Salt: CGYzqeN4plZekNC88Umm1Q==
* Hashed: Gt9Yc4AiIvmsC1QQbe2RZsCIqvoYlst2xbz0Fs8aHnw=
*/
Consulte el código fuente del tipo para ver un caso de uso ASP.NET Core Identity PasswordHasher real.