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:

  1. El KeyDerivation.Pbkdf2 método admite el consumo de varias PRF (actualmente , y ), mientras que HMACSHA1 el tipo solo admite HMACSHA256 HMACSHA512 Rfc2898DeriveBytes HMACSHA1 .

  2. 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.Pbkdf2 en determinados casos. (En Windows 8, ofrece aproximadamente 10 veces el rendimiento de Rfc2898DeriveBytes ).

  3. El KeyDerivation.Pbkdf2 método requiere que el autor de la llamada especifique todos los parámetros (salt, PRF y recuento de iteraciones). El Rfc2898DeriveBytes tipo 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.