Password hash in ASP.NET CoreHash passwords in ASP.NET Core

La base di codice di protezione dei dati include un pacchetto Microsoft. AspNetCore. Cryptography. Key Derivation che contiene funzioni di derivazione della chiave crittografica.The data protection code base includes a package Microsoft.AspNetCore.Cryptography.KeyDerivation which contains cryptographic key derivation functions. Questo pacchetto è un componente autonomo e non ha dipendenze dal resto del sistema di protezione dei dati.This package is a standalone component and has no dependencies on the rest of the data protection system. Può essere usato completamente in modo indipendente.It can be used completely independently. L'origine esiste insieme alla base del codice di protezione dei dati per praticità.The source exists alongside the data protection code base as a convenience.

Il pacchetto offre attualmente un metodo KeyDerivation.Pbkdf2 che consente l'hashing di una password usando l' algoritmo PBKDF2.The package currently offers a method KeyDerivation.Pbkdf2 which allows hashing a password using the PBKDF2 algorithm. Questa API è molto simile al tipo Rfc2898DeriveBytesesistente del .NET Framework, ma sono disponibili tre distinzioni importanti:This API is very similar to the .NET Framework's existing Rfc2898DeriveBytes type, but there are three important distinctions:

  1. Il KeyDerivation.Pbkdf2 metodo supporta l'utilizzo di più PRFs ( HMACSHA1attualmente HMACSHA256, e HMACSHA512), mentre il Rfc2898DeriveBytes tipo supporta HMACSHA1solo.The KeyDerivation.Pbkdf2 method supports consuming multiple PRFs (currently HMACSHA1, HMACSHA256, and HMACSHA512), whereas the Rfc2898DeriveBytes type only supports HMACSHA1.

  2. Il KeyDerivation.Pbkdf2 metodo rileva il sistema operativo corrente e tenta di scegliere l'implementazione più ottimizzata della routine, garantendo in alcuni casi prestazioni molto migliori.The KeyDerivation.Pbkdf2 method detects the current operating system and attempts to choose the most optimized implementation of the routine, providing much better performance in certain cases. In Windows 8 offre circa 10 volte la velocità effettiva di Rfc2898DeriveBytes.(On Windows 8, it offers around 10x the throughput of Rfc2898DeriveBytes.)

  3. Il KeyDerivation.Pbkdf2 metodo richiede che il chiamante specifichi tutti i parametri (Salt, PRF e count di iterazione).The KeyDerivation.Pbkdf2 method requires the caller to specify all parameters (salt, PRF, and iteration count). Il Rfc2898DeriveBytes tipo fornisce i valori predefiniti per questi.The Rfc2898DeriveBytes type provides default values for these.

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 secure PRNG
        byte[] salt = new byte[128 / 8];
        using (var rng = RandomNumberGenerator.Create())
        {
            rng.GetBytes(salt);
        }
        Console.WriteLine($"Salt: {Convert.ToBase64String(salt)}");
 
        // derive a 256-bit subkey (use HMACSHA1 with 10,000 iterations)
        string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
            password: password,
            salt: salt,
            prf: KeyDerivationPrf.HMACSHA1,
            iterationCount: 10000,
            numBytesRequested: 256 / 8));
        Console.WriteLine($"Hashed: {hashed}");
    }
}
 
/*
 * SAMPLE OUTPUT
 *
 * Enter a password: Xtw9NMgx
 * Salt: NZsP6NnmfBuYeJrrAKNuVQ==
 * Hashed: /OOoOer10+tGwTRDTrQSoeCxVTFr6dtYly7d0cPxIak=
 */

Per un caso d'uso reale, vedere PasswordHasher il codice sorgente per ASP.NET Core tipo di identità.See the source code for ASP.NET Core Identity's PasswordHasher type for a real-world use case.