>  기사  >  백엔드 개발  >  ASP.NET 핵심 데이터 보호

ASP.NET 핵심 데이터 보호

高洛峰
高洛峰원래의
2016-12-26 10:48:371797검색

API 인터페이스

ASP.NET Core Data Protectio는 주로 일반 개발자를 위해 IDataProtectionProvider와 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는 IDataProtectionProvider에서 상속되며 Protect 및 Unprotect라는 두 가지 메서드를 제공합니다. 하나는 암호화이고 다른 하나는 복호화인 것 같습니다. 서명은 바이트 배열로 전달됩니다. 즉, 모든 개체를 암호화하고 해독할 수 있습니다. 반환되는 것은 바이트 배열이기도 합니다. 이는 실제 사용 시 이를 직접 추가하거나 시스템의 일부 확장 방법을 사용하여 요구 사항을 지정해야 함을 의미합니다.

IDataProtectionProvider 인터페이스를 다시 살펴보겠습니다.

namespace Microsoft.AspNetCore.DataProtection
{
 public interface IDataProtectionProvider
 {
 
  IDataProtector CreateProtector(string purpose);
 }
}

IDataProtectionProvider는 목적 문자열을 전달하여 메서드를 제공합니다(자세한 내용은 아래 참조). IDataProtector 인터페이스 객체를 생성합니다.
이 인터페이스의 이름으로 판단하면 Provider로 끝나는데, 이는 이 부분에서 자체적인 암호화 및 복호화 항목 세트를 구현할 수 있음을 의미합니다.

Microsoft 프로젝트의 소스 코드를 읽을 때 xxxxProvider로 끝나는 일부 개체를 자주 볼 수 있습니다. 그러면 해당 개체의 책임은 무엇이며 어떤 역할을 합니까?
사실 이것은 Microsoft가 ASP.NET용으로 특별히 디자인한 디자인 패턴으로, Provider Model 디자인 패턴이라고 합니다. 이는 Microsoft가 개발한 23가지 디자인 패턴 중 하나에도 속하지 않습니다. 기능적인 관점에서 보면 팩토리와 전략의 결합이어야 한다. Microsoft는 ASP.NET 2.0부터 처음에는 주로 응용 프로그램 구성의 다중 구현을 구현하기 위해 이 디자인 패턴을 도입했습니다. 예를 들어 개발자에게 가장 친숙한 web.config는 데이터베이스 연결 문자열은 물론 바이너리, XML 등을 구성하는 데 사용됩니다. 이제 이 모드는 다른 곳에서 점점 더 많이 사용되고 있습니다.

CreateProtector 메서드 시그니처의 목적 문자열에 대해 이야기해 보겠습니다. 이전 블로그 게시물에서는 독자들의 이해를 돕기 위해 들어오는 목적을 공개 키로 이해할 수 있다고 말했습니다. 사실 이는 엄밀한 표현이 아니며 현 프로텍터의 목적을 나타내는 로고로 이해될 수 있다.

IDataProtector를 사용하면 Microsoft.AspNetCore.DataProtection 네임스페이스 아래에 몇 가지 확장 메서드도 있음을 알 수 있습니다.

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);
}


보시다시피 CreateProtector는 다양한 목적(IEnumerable, params string[])을 전달할 수 있는 메서드도 제공합니다.

예: 메시지 통신 프로세스 중에 사용자 세션을 암호화하기 위해 CreateProtector("Security.BearerToken")를 사용합니다. 하지만 암호화할 때 신뢰할 수 없는 클라이언트가 메시지를 보낸다는 보장이 없기 때문에 암호화를 위해 CreateProtector("username")를 생각했습니다. 이때 "Security.BearerToken"이라는 사용자가 있으면 암호화됩니다. Security.BearerToken을 식별자로 사용하는 다른 수호자와 충돌하므로
CreateProtector([ “Security.BearerToken”, “User: username” ])를 사용할 수 있습니다. 이는

공급자.CreateProtector(“Security.BearerToken).CreateProtector(“User: 사용자 이름”)과 동일합니다. 이는 먼저 “Security.BearerToken”이라는 보호기를 생성한 다음 “User: 사용자 이름”이라는 보호기를 생성하는 것을 의미합니다. 수호자.



사용자 암호 해시

는 사용자 암호 해시

에 대한 Microsoft.AspNetCore.Cryptography.KeyDerivation 네임스페이스에서 KeyDerivation.Pbkdf2 메서드를 제공합니다.

수명주기 제한이 있는 암호화

때때로 사용자가 다음을 찾는 것과 같이 만료 또는 만료 시간이 있는 암호화된 문자열이 필요할 때가 있습니다. 비밀번호를 반환할 때 다음 주소로 재설정 명령이 포함된 이메일을 보냅니다. 이 재설정 명령에는 만료 시간이 있어야 합니다. 이 만료 시간이 지나면 유효하지 않게 됩니다. 과거에는 전송 시간을 표시하기 위해 데이터베이스에 요청을 보내야 했습니다.

이제 이를 수행할 필요가 없습니다. ASP.NET Core는 기본적으로 ITimeLimitedDataProtector라는 인터페이스를 제공합니다. 이 인터페이스의 정의에서:

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

ITimeLimitedDataProtector는 수명 주기로 암호화 방법을 설정하기 위한 여러 오버로드된 방법을 제공하며 사용자는 다음을 통해 시간을 설정할 수 있습니다. Date TimeOffset, TimeSpan 및 기타 매개변수

에 해당 암호화가 있는 경우 해당 복호화 방법이 있는데 여기서는 자세히 소개하지 않습니다.

데이터 보호 구성

在我们的 ASP.NET Core 运行的时候,系统会基于当前机器的运行环境默认配置一些关于 Data Protection 的东西,但是有些时候可能需要对这些配置做一些改变,比如在分布式部署的时候,在上一篇博文的末尾也提到过,下面就来看一下具体怎么配置的吧。 

上篇文章已经提到过,我们通过以下方式来把 Data Protection 注册到服务中:

public void ConfigureServices(IServiceCollection services)
{
 services.AddDataProtection();
}

   


其中AddDataProtection 返回的是一个 IDataProtectionBuilder 接口,这个接口提供了一个扩展方法PersistKeysToFileSystem() 来存储私钥。可以通过它传入一个路径来指定私钥存储的位置:

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, 下篇介绍一些高级的用法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

更多ASP.NET Core 数据保护(Data Protection)相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.