Hasła skrótu w ASP.NET CoreHash passwords in ASP.NET Core

Baza kodu ochrony danych zawiera pakiet Microsoft. AspNetCore. Cryptography. Key, który zawiera funkcje wyprowadzania klucza kryptograficznego.The data protection code base includes a package Microsoft.AspNetCore.Cryptography.KeyDerivation which contains cryptographic key derivation functions. Ten pakiet jest składnikiem autonomicznym i nie ma żadnych zależności w pozostałej części systemu ochrony danych.This package is a standalone component and has no dependencies on the rest of the data protection system. Może być używany całkowicie niezależnie.It can be used completely independently. Źródło istnieje wraz z bazą kodu ochrony danych jako wygoda.The source exists alongside the data protection code base as a convenience.

Pakiet oferuje obecnie metodę KeyDerivation.Pbkdf2 , która umożliwia mieszanie hasła przy użyciu algorytmu PBKDF2.The package currently offers a method KeyDerivation.Pbkdf2 which allows hashing a password using the PBKDF2 algorithm. Ten interfejs API jest bardzo podobny do istniejącego typu Rfc2898DeriveBytes.NET Framework, ale istnieją trzy ważne rozróżnienia:This API is very similar to the .NET Framework's existing Rfc2898DeriveBytes type, but there are three important distinctions:

  1. KeyDerivation.Pbkdf2Metoda obsługuje zużywanie wielu PRFs (obecnie HMACSHA1 , HMACSHA256 i HMACSHA512 ), podczas gdy Rfc2898DeriveBytes Typ obsługuje tylko HMACSHA1 .The KeyDerivation.Pbkdf2 method supports consuming multiple PRFs (currently HMACSHA1, HMACSHA256, and HMACSHA512), whereas the Rfc2898DeriveBytes type only supports HMACSHA1.

  2. KeyDerivation.Pbkdf2Metoda wykrywa bieżący system operacyjny i próbuje wybrać najbardziej zoptymalizowaną implementację procedury, zapewniając znacznie lepszą wydajność w niektórych przypadkach.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. (W systemie Windows 8 oferuje około 10X przepływności Rfc2898DeriveBytes .)(On Windows 8, it offers around 10x the throughput of Rfc2898DeriveBytes.)

  3. KeyDerivation.Pbkdf2Metoda wymaga, aby obiekt wywołujący określił wszystkie parametry (sól, PRF i liczba iteracji).The KeyDerivation.Pbkdf2 method requires the caller to specify all parameters (salt, PRF, and iteration count). Rfc2898DeriveBytesTyp zawiera wartości domyślne dla tych.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=
 */

Zobacz kod źródłowy typu dla ASP.NET Core Identity PasswordHasher rzeczywistego przypadku użycia.See the source code for ASP.NET Core Identity's PasswordHasher type for a real-world use case.