login register Sysop! about ME  
qrcode
    최초 작성일 :    2017년 07월 10일
  최종 수정일 :    2017년 07월 10일
  작성자 :    soggun
  편집자 :    soggun (송원석)
  읽음수 :    1,808

강좌 목록으로 돌아가기

필자의 잡담~

이번 컬럼은 ASP.NET Core 데이터 보안 강좌 중에서 비밀번호 해싱에 대한 개요를 다루는 글입니다.

모든 컬럼은 http://docs.asp.net의 내용을 참고하여 번역한 것입니다. Windows 뿐만 아니라 Linxu, OS X에서도 동작하는 완전한 크로스 플랫폼 서버기술인 ASP.NET Core! 기대해 주세요.

본 번역문서는 개인적인 취지로 번역되어 제공되는 문서로, 원문을 비롯한 모든 저작권은 마이크로소프트사에 있습니다. 마이크로소프트사의 요청이 있을 경우, 언제라도 게시가 중단될 수 있습니다. 본 번역문서에는 오역이 포함되어 있을 수 있으며 주석도 번역자 개인의 견해일뿐입니다. 마이크로소프트사는 본 문서의 번역된 내용에 대해 일체의 보장을 하지 않습니다. 번역이 완료된 뒤에도 제품이 업그레이드 되거나 기능이 변경됨에 따라 원문도 변경되거나 보완되었을 수 있으므로 참고하시기 바랍니다.

원문: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/consumer-apis/password-hashing

데이터 보호 코드 베이스에는 암호화 키 파생 함수를 제공해주는 Microsoft.AspNetCore.Cryptography.KeyDerivation 패키지가 포함되어 있습니다. 이 패키지는 독립적인 구성 요소로서 데이터 보호 시스템의 나머지 다른 부분들에 의존하지 않습니다. 이 패키지는 완벽히 독립적으로 사용이 가능합니다. 다만 편의상 소스가 데이터 보호 코드 베이스와 함께 위치해 있을 뿐입니다.

이 패키지는 PBKDF2 알고리즘을 이용해서 비밀번호 해싱을 수행하는 KeyDerivation.Pbkdf2 메서드를 제공합니다. 이 API는 .NET 프레임워크의 기존 Rfc2898DeriveBytes 형식과 매우 비슷하지만, 세 가지 중요한 차이점이 존재합니다:

  1. KeyDerivation.Pbkdf2 메서드는 다양한 PRF들을 사용할 수 있는 반면 (현재 HMACSHA1, HMACSHA256, 그리고 HMACSHA512를 지원합니다), Rfc2898DeriveBytes 형식은 HMACSHA1만 지원합니다.

  2. KeyDerivation.Pbkdf2 메서드는 현재 운영 체제를 감지해서 가장 최적화된 구현 루틴을 선택하기 때문에 상황에 따라 훨씬 향상된 성능을 제공해줍니다. (Windows 8에서는 Rfc2898DeriveBytes보다 약 10배에 가까운 성능을 보여줍니다.)

  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 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 형식의 소스 코드를 참고하시기 바랍니다.


authored by

  hskim618
  2017-07-11(11:04)
캐릭 이미지
잘 볼게요~

 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})