Heim >Backend-Entwicklung >C#.Net-Tutorial >ASP.NET Core-Datenschutz

ASP.NET Core-Datenschutz

高洛峰
高洛峰Original
2016-12-26 10:48:371873Durchsuche

API-Schnittstelle

ASP.NET Core Data Protectio bietet hauptsächlich zwei Schnittstellen für normale Entwickler: IDataProtectionProvider und IDataProtector.
Werfen wir zunächst einen Blick auf die Beziehung zwischen diesen beiden Schnittstellen:

namespace Microsoft.AspNetCore.DataProtection
{
 //
 // 摘要:
 //  An interface that can provide data protection services.
 public interface IDataProtector : IDataProtectionProvider
 {
 
  byte[] Protect(byte[] plaintext);
 
  byte[] Unprotect(byte[] protectedData);
 }
}

Wie Sie sehen können, erbt IDataProtector von IDataProtectionProvider und stellt zwei Methoden namens Protect und Unprotect bereit Von Es scheint, dass es sich bei dem einen um eine Verschlüsselung und bei dem anderen um eine Entschlüsselung handelt. Ihre Signaturen werden in einem Byte-Array übergeben, was bedeutet, dass sie alle Objekte ver- und entschlüsseln können. Was zurückgegeben wird, ist auch ein Byte-Array, was bedeutet, dass wir es bei der tatsächlichen Verwendung selbst hinzufügen oder einige Erweiterungsmethoden des Systems verwenden sollten, um unsere Anforderungen zu spezifizieren.

Werfen wir noch einmal einen Blick auf die IDataProtectionProvider-Schnittstelle:

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

IDataProtectionProvider stellt eine Methode bereit, indem es eine Zweckzeichenfolge übergibt (siehe Details unten). Generieren Sie ein IDataProtector-Schnittstellenobjekt.
Dem Namen dieser Schnittstelle nach zu urteilen, endet sie mit Provider, was bedeutet, dass wir in diesem Teil unsere eigenen Verschlüsselungs- und Entschlüsselungsfunktionen implementieren können.

Wenn wir den Quellcode von Microsoft-Projekten lesen, sehen wir oft, dass einige Objekte mit xxxxProvider enden. Welche Aufgaben hat es also und welche Rolle spielt es?
Tatsächlich handelt es sich um ein von Microsoft speziell für ASP.NET entwickeltes Designmuster namens Provider Model Design Pattern. Man kann auch sagen, dass es nicht zu den 23 Designmustern gehört. Aus funktionaler Sicht sollte es sich dann um eine Kombination aus Fabrik und Strategie handeln. Microsoft hat dieses Entwurfsmuster seit ASP.NET 2.0 eingeführt, zunächst hauptsächlich zur Implementierung mehrerer Implementierungen der Anwendungskonfiguration. Beispielsweise dient web.config, das den Entwicklern am besten bekannt ist, der Konfiguration von Datenbankverbindungszeichenfolgen, Binärdateien, XML usw. Dieser Modus wird mittlerweile auch an anderen Stellen immer häufiger verwendet.

Lassen Sie uns über die Zweckzeichenfolge in der Signatur der CreateProtector-Methode sprechen. Zum besseren Verständnis für die Leser habe ich gesagt, dass der eingehende Zweck als öffentlicher Schlüssel verstanden werden kann Tatsache ist, dass die Aussage nicht streng ist und als Logo verstanden werden kann, das auf den Zweck des aktuellen Beschützers hinweist.

Wenn Sie IDataProtector verwenden, werden Sie feststellen, dass es auch einige Erweiterungsmethoden gibt, die sich unter dem Microsoft.AspNetCore.DataProtection-Namespace befinden:

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


Wie Sie sehen, bietet CreateProtector auch Methoden, die mehrere Zwecke erfüllen können (IEnumerable, params string[]). Warum besteht ein solcher Bedarf?

Tatsächlich hat DataProtector eine hierarchische Struktur. Schauen Sie sich noch einmal die IDataProtector-Schnittstelle an. Sie implementiert auch die IDataProtectionProvider-Schnittstelle, was bedeutet, dass IDataProtector selbst auch IDataProtector erstellen kann.

Zum Beispiel: Wir arbeiten an einem Nachrichtenkommunikationssystem. Während des Nachrichtenkommunikationsprozesses muss die Sitzung des Benutzers verschlüsselt werden. Beim Verschlüsseln gibt es jedoch keine Garantie dafür, dass die Nachricht von einem nicht vertrauenswürdigen Client gesendet wird. Daher habe ich mir zum Verschlüsseln einen Benutzer mit dem Namen „Security.BearerToken“ überlegt Konflikte mit einem anderen Protector, der Security.BearerToken als Bezeichner verwendet, daher können wir
CreateProtector([ „Security.BearerToken“, „Benutzer: Benutzername“ ]) verwenden. Es entspricht
provider.CreateProtector(“Security.BearerToken).CreateProtector(“Benutzer: Benutzername”). Es bedeutet, zuerst einen Schutz mit dem Namen „Security.BearerToken“ und dann einen Schutz mit dem Namen „Benutzer: Benutzername“ zu erstellen " Protector.

Benutzerkennwort-Hash

stellt eine KeyDerivation.Pbkdf2-Methode unter dem Microsoft.AspNetCore.Cryptography.KeyDerivation-Namespace für Benutzerkennwort-Hash bereit.

Verschlüsselung mit Lebenszyklusbeschränkungen

Manchmal benötigen wir einige verschlüsselte Zeichenfolgen mit Ablauf oder Ablaufzeit, z. B. wenn ein Benutzer nach der Rückgabe des Passworts sucht, senden wir eine E-Mail mit einem Reset-Befehl An das Postfach des Benutzers muss eine Ablaufzeit gesendet werden. Nach dieser Ablaufzeit müssen wir möglicherweise eine Anfrage an die Datenbank senden Dann entschlüsseln und vergleichen Sie den Zeitunterschied mit der Datenbank, um dies zu überprüfen.

Jetzt müssen wir dies nicht tun. Standardmäßig stellt ASP.NET Core eine Schnittstelle namens ITimeLimitedDataProtector bereit Schauen Sie sich die Definition dieser Schnittstelle an:

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 bietet mehrere überladene Methoden zum Festlegen von Verschlüsselungsmethoden mit Lebenszyklen. Benutzer können die Zeit festlegen über Date TimeOffset, TimeSpan und andere Parameter

Es gibt entsprechende Verschlüsselungsmethoden, und interessierte Studierende können sich dort die offizielle Dokumentation

Konfigurieren des Datenschutzes
ansehen

在我们的 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中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn