ASP.NET Core의 해시 암호

이 문서에서는 KeyDerivation.Pbkdf2 메서드로서, PBKDF2 알고리즘을 사용하여 비밀번호 해싱을 가능하게 하는 메서드를 호출하는 방법을 보여줍니다.

Warning

KeyDerivation.Pbkdf2 API는 하위 수준의 암호화 기본 형식이며 앱을 기존 프로토콜 또는 암호화 시스템에 통합하는 데 사용됩니다. KeyDerivation.Pbkdf2는 비밀번호 기반 로그인을 지원하여 데이터 저장소에 해시된 비밀번호를 저장하여야 하는 신규 앱에서 사용해서는 안 됩니다. 신규 앱은 PasswordHasher를 사용하세요. PasswordHasher에 대한 자세한 내용은 ASP.NET Core 탐색Identity을 참조하세요.

데이터 보호 코드 베이스에는 암호학적 키 파생 함수를 포함하는 NuGet 패키지 Microsoft.AspNetCore.Cryptography.KeyDerivation이 포함되어 있습니다. 이 패키지는 독립 실행형 구성 요소이며 나머지 데이터 보호 시스템에 대한 종속성이 없습니다. 이는 독립적으로 사용할 수 있습니다. 원본은 데이터 보호 코드 베이스와 함께 편의를 위해 존재합니다.

Warning

아래 코드에서는 공유 비밀 키를 생성하기 위해 KeyDerivation.Pbkdf2를 사용하는 방법을 보여줍니다. 데이터 저장소에 저장할 비밀번호를 해싱하는데 사용해서는 안 됩니다.

using Microsoft.AspNetCore.Cryptography.KeyDerivation;
using System.Security.Cryptography;

Console.Write("Enter a password: ");
string? password = Console.ReadLine();

// Generate a 128-bit salt using a sequence of
// cryptographically strong random bytes.
byte[] salt = RandomNumberGenerator.GetBytes(128 / 8); // divide by 8 to convert bits to bytes
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=
 */
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에 대한 PasswordHasher 유형에 관련된 소스 코드를 참조하세요.

참고 항목

.NET 참조 원본의 설명서 링크는 일반적으로 다음 릴리스의 .NET을 위한 현재 개발을 나타내는 리포지토리의 기본 분기를 로드합니다. 특정 릴리스를 위한 태그를 선택하려면 Switch branches or tags(분기 또는 태그 전환) 드롭다운 목록을 사용합니다. 자세한 내용은 ASP.NET Core 소스 코드(dotnet/AspNetCore.Docs #26205)의 버전 태그를 선택하는 방법을 참조하세요.