ASP.NET 코어 데이터 보호(Data Protection)중편

머리말 
상편주로 ASP.NET Core 의 Data Protection 에 대해 간단 한 소 개 를 했 는데 본 편 은 주로 API 와 사용 방법 을 소개 한다. 
API 인터페이스 
ASP.NET Core Data Protectio 는 주로 일반 개발 자 에 게 두 개의 인터페이스,IDataProtection Provider 와 IDataProtector 를 제공 합 니 다.
 우 리 는 먼저 이 두 인터페이스의 관 계 를 살 펴 보 자.

 namespace Microsoft.AspNetCore.DataProtection
{
 //
 //   :
 //  An interface that can provide data protection services.
 public interface IDataProtector : IDataProtectionProvider
 {

  byte[] Protect(byte[] plaintext);

  byte[] Unprotect(byte[] protectedData);
 }
} 

이 를 통 해 알 수 있 듯 이 IDataProtector 는 IDataProtection Provider 에서 계승 되 었 고 두 가지 방법 으로 Protect 와 Unprotect 를 제공 했다.이름 을 보면 하 나 는 암호 화 이 고 하 나 는 복호화 이다.그리고 그들의 서명 은 모두 byte 배열 에 들 어 가 는 것 으로 모든 대상 을 암호 화하 고 복호화 할 수 있다 는 것 을 의미한다.돌아 오 는 것 도 byte 배열 입 니 다.즉,실제 사용 과정 에서 우 리 는 시스템 의 확장 방법 을 추가 하거나 사용 하여 우리 의 수 요 를 구체화 해 야 합 니 다. 
IDataProtection Provider 인 터 페 이 스 를 다시 한 번 봅 시다.

 namespace Microsoft.AspNetCore.DataProtection
{
 public interface IDataProtectionProvider
 {

  IDataProtector CreateProtector(string purpose);
 }
} 

IDataProtection Provider 는 purpose 문자열(뒤에 상세 한 설명 참조)을 전송 하여 IDataProtector 인터페이스 대상 을 만 드 는 방법 을 제공 합 니 다.
 이 인터페이스의 이름 을 보면 Provider 로 끝 납 니 다.즉,이 부분 에서 우 리 는 자신의 복호화 한 것 을 실현 할 수 있 습 니 다. 
우 리 는 마이크로소프트 프로젝트 의 소스 코드 를 읽 을 때 xxxx Provider 로 끝 나 는 대상 을 자주 본다.그러면 그 직책 은 무엇 이 며,동시에 어떤 역할 을 하 는 것 일 까?
 사실은 이것 은 마이크로소프트 가 ASP.NET 을 위해 디자인 한 디자인 모델 로 Provider Model 디자인 모델 이 라 고도 할 수 있 고 마이크로소프트 가 발명 한 것 이 라 고 할 수 있다.이것 은 23 가지 디자인 모델 중의 하나 에 속 하지 않 는 다.기능 적 으로 볼 때 공장 과 전략의 결합 체 여야 한다.ASP.NET 2.0 부터 마이크로소프트 는 이런 디자인 모델 을 도입 하기 시 작 했 고 처음에 응용 프로그램의 설정 을 실현 하 는 여러 가지 실현 에 사용 되 었 다.예 를 들 어 개발 자가 가장 잘 아 는 웹.config 에서 데이터베이스 연결 문자열 에 대한 설정,그리고 바 이 너 리,예 를 들 어 XML 등 이 많 습 니 다.현재 다른 곳 에서 도 이런 모델 을 점점 더 많이 사용 하고 있 습 니 다. 
다시 한 번 말씀 드 리 지만 Create Protector 방법 서명 중의 purpose 라 는 문자열 은 지난 블 로그 에서 독 자 를 위해 잘 이해 하기 위해 저 는 들 어 온 purpose 를 공개 키 로 이해 할 수 있다 고 말 했 습 니 다.사실은 이 표현 은 엄밀 하지 않 고 하나의 표지 로 이해 하여 현재 Protector 의 용 도 를 지시 할 수 있 습 니 다. 
IDataProtector 를 사용 할 때 Microsoft.AspNetCore.Data Protection 네 임 스페이스 에 확장 방법 이 있 음 을 발견 할 수 있 습 니 다.

 public static class DataProtectionCommonExtensions
{
 public static IDataProtector CreateProtector(this IDataProtectionProvider provider, IEnumerable<string> purposes);

 public static IDataProtector CreateProtector(this IDataProtectionProvider provider, string purpose, params string[] subPurposes);

 public static IDataProtector GetDataProtector(this IServiceProvider services, IEnumerable<string> purposes);

 public static IDataProtector GetDataProtector(this IServiceProvider services, string purpose, params string[] subPurposes);

 public static string Protect(this IDataProtector protector, string plaintext);

 public static string Unprotect(this IDataProtector protector, string protectedData);
} 

이 를 통 해 알 수 있 듯 이 Create Protector 는 여러 purpose 를 전달 할 수 있 는 방법(IEnumerable,params string[])도 제공 했다.왜 이런 수요 가 있 을 까? 
사실 DataProtector 는 차원 적 인 구조 가 있 습 니 다.다시 한 번 IDataProtector 인 터 페 이 스 를 보면 그 자체 도 IDataProtection Provider 인 터 페 이 스 를 실 현 했 습 니 다.즉,IDataProtector 자체 도 IDataProtector 를 다시 만 들 수 있 습 니 다. 
예 를 들 어 저 희 는 메시지 통신 시스템 을 만 들 고 있 습 니 다.메시지 통신 과정 에서 사용자 의 세 션 을 암호 화 해 야 합 니 다.저 희 는 Create Protector("Security.BearerToken")를 사용 하여 암호 화 합 니 다.그러나 암호 화 할 때 메시지 가 신뢰 할 수 없 는 클 라 이언 트 가 보 낸 것 이 라 고 보장 할 수 없 기 때문에 Create Protector(username)를 사용 하여 암호 화 할 생각 이 들 었 습 니 다.이때 사용자 의 사용자 이름 이'Security.BearerToken'이 라면 다른 사용자 가 Security.BearerToken 을 표시 하 는 Protector 로 사용 하 는 것 과 충돌 할 수 있 기 때문에 저 희 는 사용 할 수 있 습 니 다.
 CreateProtector(["Security.BearerToken","User:username"])이런 방식.에 해당 하 다,...
 provider.CreateProtector(“Security.BearerToken).CreateProtector(“User: username”)。 먼저"Security.BearerToken"이라는 Protector 를 만 든 다음,purpose 1 에서"User:username"이라는 Protector 를 만 든 다 는 뜻 이다.
사용자 암호 해시 
Microsoft.AspNetCore.Cryptography.KeyDerivation 네 임 스페이스 에서 사용자 암 호 를 해시 하 는 데 사용 할 KeyDerivation.Pbkdf 2 방법 을 제공 합 니 다. 
라 이 프 사이클 제한 이 있 는 암호 화 
어떤 때 는 사용자 가 비밀 번 호 를 찾 을 때 리 셋 명령 이 있 는 메 일 을 사용자 의 메 일 로 보 내야 합 니 다.이 리 셋 명령 은 만 료 시간 이 필요 합 니 다.이 만 료 시간 을 초과 하면 효력 을 잃 습 니 다.이전에 우 리 는 데이터베이스 에 전송 시간 을 표시 하 는 시간 을 저장 한 다음 에 암호 화 대비 와 데이터베이스 의 시간 차 를 풀 어 검증 해 야 할 수도 있 습 니 다. 
이제 우 리 는 이렇게 할 필요 가 없다.ASP.NET Core 는 기본적으로 ITimeLimited DataProtector 라 는 인 터 페 이 스 를 제공 했다.우 리 는 먼저 이 인터페이스의 정 의 를 살 펴 보 자.

CreateProtector(string purpose) : ITimeLimitedDataProtector This API is similar to the existing IDataProtectionProvider.CreateProtector in that it can be used to create purpose chains from a root time-limited protector.
Protect(byte[] plaintext, DateTimeOffset expiration) : byte[]
Protect(byte[] plaintext, TimeSpan lifetime) : byte[]
Protect(byte[] plaintext) : byte[]
Protect(string plaintext, DateTimeOffset expiration) : string
Protect(string plaintext, TimeSpan lifetime) : string
Protect(string plaintext) : string 
ITimeLimited DataProtector 는 수명 주기 가 있 는 암호 화 방법 을 설정 하기 위해 여러 개의 리 로드 방법 을 제공 합 니 다.사용 자 는 Date TimeOffset,TimeSpan 등 매개 변 수 를 통 해 시간 을 설정 할 수 있 습 니 다. 
해당 하 는 암호 화가 있 으 면 해당 하 는 복호화 방법 이 있 고 여기 서 상세 하 게 소개 하지 않 습 니 다.관심 있 는 학생 은 공식 문 서 를 보 러 갈 수 있다. 
데이터 보호 설정 
우리 의 ASP.NET Core 가 실 행 될 때 시스템 은 현재 기계 의 운행 환경 을 바탕 으로 기본적으로 Data Protection 에 관 한 것 을 설정 합 니 다.그러나 어떤 때 는 이러한 설정 에 대해 변 화 를 해 야 할 수도 있 습 니 다.예 를 들 어 분포 식 배 치 를 할 때 지난 블 로그 의 말미 에 도 언급 했 습 니 다.다음은 구체 적 으로 어떻게 설정 하 는 지 살 펴 보 겠 습 니 다. 
위의 글 에서 언급 한 바 와 같이 저 희 는 다음 과 같은 방식 으로 Data Protection 을 서비스 에 등록 합 니 다.

 public void ConfigureServices(IServiceCollection services)
{
 services.AddDataProtection();
} 
그 중에서 AddDataProtection 은 IDataProtection Builder 인 터 페 이 스 를 되 돌려 줍 니 다.이 인 터 페 이 스 는 확장 방법 인 PersistKeys ToFileSystem()을 제공 하여 비밀 키 를 저장 합 니 다.비밀 키 가 저 장 된 위 치 를 지정 할 수 있 는 경 로 를 입력 할 수 있 습 니 다.

 public void ConfigureServices(IServiceCollection services)
{
 services.AddDataProtection()
  .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));

} 

공유 폴 더 에 전송 하여 비밀 키 를 저장 할 수 있 습 니 다.그러면 서로 다른 기계 의 비밀 키 에서 한 위치 에 저장 할 수 있 습 니 다.이런 방식 을 통 해 분포 식 배 치 를 할 때 기계 의 차별 화 를 막 을 수 있다.
 안전 하지 않다 면 X.509 인증 서 를 설정 하여 암호 화 할 수 있 습 니 다.

 public void ConfigureServices(IServiceCollection services)
{
 services.AddDataProtection()
  .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"))
  .ProtectKeysWithCertificate("thumbprint");
} 
이전 글 에서 말 했 듯 이 Data Protection 의 기본 저장 시간 은 90 일 입 니 다.다음 과 같은 방식 으로 기본 저장 시간 을 수정 할 수 있 습 니 다.

 public void ConfigureServices(IServiceCollection services)
{
 services.AddDataProtection()
  .SetDefaultKeyLifetime(TimeSpan.FromDays(14));
} 
기본적으로 같은 물리 키 라 이브 러 리 를 사용 하 더 라 도 Data Protection 은 다른 프로그램 에서 다른 프로그램의 키 를 가 져 오 는 것 을 방지 할 수 있 기 때 문 입 니 다.따라서 같은 프로그램 이 라면 같은 프로그램 이름 을 설정 할 수 있 습 니 다.

 public void ConfigureServices(IServiceCollection services)
{
 services.AddDataProtection()
  .SetApplicationName("my application");
} 
프로그램 에서 키 를 만 들 지 않 거나 키 를 만 들 거나 관리 하 는 프로그램 이 하나 밖 에 없다 면 다음 과 같이 할 수 있 습 니 다.

 public void ConfigureServices(IServiceCollection services)
{
 services.AddDataProtection()
  .DisableAutomaticKeyGeneration();
} 
암호 화 알고리즘 수정 
UseCryptographicAlgorithms 방법 으로 ASP.NET Core Data Protection 의 기본 암호 화 알고리즘 을 수정 할 수 있 습 니 다.다음 과 같 습 니 다.

 services.AddDataProtection()
 .UseCryptographicAlgorithms(new AuthenticatedEncryptionSettings()
 {
  EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
  ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
 }); 

요약:
이 편 은 주로 자주 사용 하 는 API 를 소개 하 였 으 며,다음 편 은 고급 용법 을 소개 하 였 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기