Хэширование паролей в ASP.NET Core

База кода защиты данных включает пакет Microsoft. AspNetCore. Cryptography. KeyDerivation , который содержит функции формирования ключа шифрования. Этот пакет является автономным компонентом и не зависит от остальной части системы защиты данных. Его можно использовать полностью независимо друг от друга. Для удобства источник существует рядом с базой кода защиты данных.

В настоящее время пакет содержит метод KeyDerivation.Pbkdf2 , позволяющий хэшировать пароль с помощью KeyDerivation.Pbkdf2. этот API очень похож на существующий тип Rfc2898DeriveBytesплатформа .NET Framework, но есть три важных различия:

  1. KeyDerivation.Pbkdf2Метод поддерживает использование нескольких прфс (в настоящее время HMACSHA1 , HMACSHA256 и HMACSHA512 ), в то время как Rfc2898DeriveBytes тип поддерживает только HMACSHA1 .

  2. KeyDerivation.Pbkdf2Метод обнаруживает текущую операционную систему и пытается выбрать наиболее оптимизированную реализацию подпрограммы, предоставляя гораздо более высокую производительность в некоторых случаях. (на Windows 8 он предлагает примерно 10 раз пропускную способность Rfc2898DeriveBytes .)

  3. KeyDerivation.Pbkdf2Метод требует, чтобы вызывающий объект указал все параметры (соль, PRF и число итераций). Rfc2898DeriveBytesТип предоставляет значения по умолчанию для этих параметров.

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=
 */

В ASP.NET Core Identity реальном варианте использования см. Identity/екстенсионс.коре/СРК/пассвордхашер.КС "Data-nКод =" External ">исходный код для PasswordHasher типа.