Хэш пароля

Код защиты данных включает в себя пакет Microsoft.AspNet.Cryptography.KeyDerivation, который содержит функции для создания криптографических ключей. Этот пакет технически является отдельным компонентом, у него нет зависимостей от остальной части системы защиты данных и его можно использовать абсолютно независимо от других пакетов. (Технически этот пакет не является частью системы защиты данных).

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

  1. Метод KeyDerivation.Pbkdf2 поддерживает несколько PRF (HMACSHA1, HMACSHA256 и HMACSHA512), а Rfc2898DeriveBytes поддерживает только HMACSHA1.
  2. Метод KeyDerivation.Pbkdf2 определяет операционную систему и пытается выбрать наиболее оптимальную реализацию, предлагая в определенных случаях более высокую эффективность.
  3. Метод KeyDerivation.Pbkdf2 требует, чтобы вызывающий элемент указал все параметры. Тип 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 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=
 */

См. исходный код для ASP.NET Core Identity PasswordHasher.

Поделись хорошей новостью с друзьями!
Следи за новостями!