암호 해시Password Hashing

패키지를 포함 하는 데이터 보호 코드 베이스 Microsoft.AspNetCore.Cryptography.KeyDerivation 는 암호화 키 파생 함수를 포함 합니다.The data protection code base includes a package Microsoft.AspNetCore.Cryptography.KeyDerivation which contains cryptographic key derivation functions. 이 패키지는 독립 실행형 구성 요소와 데이터 보호 시스템의 나머지 부분에 의존 하지 않습니다.This package is a standalone component and has no dependencies on the rest of the data protection system. 사용할 수 없습니다 완전히 독립적입니다.It can be used completely independently. 소스 편의 위해 기본 데이터 보호 코드와 함께 존재합니다.The source exists alongside the data protection code base as a convenience.

패키지는 현재 메서드를 제공 KeyDerivation.Pbkdf2 사용 하 여 암호 해시를 허용 하는 PBKDF2 알고리즘합니다.The package currently offers a method KeyDerivation.Pbkdf2 which allows hashing a password using the PBKDF2 algorithm. 이 API는.NET Framework의 기존와 매우 유사 Rfc2898DeriveBytes 형식, 하지만 세 가지 중요 한 차이가 있습니다.This API is very similar to the .NET Framework's existing Rfc2898DeriveBytes type, but there are three important distinctions:

  1. KeyDerivation.Pbkdf2 여러 PRFs 사용 방법은 지원 (현재 HMACSHA1, HMACSHA256, 및 HMACSHA512) 인 반면는 Rfc2898DeriveBytes 형식에서 지원만 HMACSHA1합니다.The KeyDerivation.Pbkdf2 method supports consuming multiple PRFs (currently HMACSHA1, HMACSHA256, and HMACSHA512), whereas the Rfc2898DeriveBytes type only supports HMACSHA1.

  2. KeyDerivation.Pbkdf2 메서드는 현재 운영 체제를 검색 하 고 특정 한 경우에 훨씬 더 나은 성능을 제공 하는 루틴의 가장 최적화 된 구현을 선택 하려고 합니다.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. (Windows 8에서 약 10 배의 처리량을 제공 Rfc2898DeriveBytes.)(On Windows 8, it offers around 10x the throughput of Rfc2898DeriveBytes.)

  3. KeyDerivation.Pbkdf2 메서드에 필요한 모든 매개 변수를 지정 하려면 호출자 (솔트, PRF, 및 반복 횟수).The KeyDerivation.Pbkdf2 method requires the caller to specify all parameters (salt, PRF, and iteration count). Rfc2898DeriveBytes 유형 이들에 대 한 기본값을 제공 합니다.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=
 */
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 Id에 대 한 소스 코드 참조 PasswordHasher 실제 환경에 대 한 입력 사례를 사용 합니다.See the source code for ASP.NET Core Identity's PasswordHasher type for a real-world use case.