ASP.NET Core의 해시 암호

이 문서에서는 PBKDF2 알고리즘을 사용하여 암호를 해시할 수 있는 메서드를 호출 KeyDerivation.Pbkdf2 하는 방법을 보여 줍니다.

경고

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

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

경고

다음 코드에서는 공유 비밀 키를 생성하는 데 사용하는 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)의 버전 태그를 선택하는 방법을 참조하세요.