Teilen über


Zweckzeichenfolgen in ASP.NET Core

Komponenten, die verbrauchen IDataProtectionProvider , müssen einen eindeutigen Zweckparameter an die CreateProtector Methode übergeben. Der Parameter " Zweck" ist der Sicherheit des Datenschutzsystems inhärent, da er eine Isolation zwischen kryptografischen Verbrauchern bietet, auch wenn die stammgrafischen Schlüssel identisch sind.

Wenn ein Consumer einen Zweck angibt, wird die Zweckzeichenfolge zusammen mit den kryptografischen Stammschlüsseln verwendet, um kryptografische Unterschlüssel abzuleiten, die für diesen Verbraucher eindeutig sind. Dadurch wird der Verbraucher von allen anderen kryptografischen Verbrauchern in der Anwendung isoliert: Keine andere Komponente kann seine Nutzlasten lesen, und er kann die Nutzlasten anderer Komponenten nicht lesen. Diese Isolation macht ganze Angriffsarten auf die Komponente unmöglich.

Beispiel für ein Zweckdiagramm

Im obigen IDataProtector Diagramm können Instanzen A und B die Nutzlasten der anderen nicht lesen, nur ihre eigenen.

Die Zweckzeichenfolge muss nicht geheim sein. Es sollte einfach einzigartig sein, dass keine andere gut funktionierende Komponente jemals denselben Zweck-String bereitstellen wird.

Tipp

Die Verwendung des Namespaces und des Typnamens der Komponente, die die Datenschutz-APIs verwendet, ist eine gute Faustregel, da diese Informationen in der Praxis niemals in Konflikt stehen.

Eine von Contoso entwickelte Komponente, die für das Erstellen von Bearer-Tokens verantwortlich ist, könnte Contoso.Security.BearerToken als Funktionszeichenfolge verwenden. Oder – noch besser – könnte Contoso.Security.BearerToken.v1 als Zweckstring verwendet werden. Durch das Anfügen der Versionsnummer kann eine zukünftige Version Contoso.Security.BearerToken.v2 als Zweck festlegen, und die verschiedenen Versionen wären vollständig voneinander isoliert im Hinblick auf die Nutzlasten.

Da es sich bei dem Parameter CreateProtector um ein Zeichenfolgenarray handelt, hätte stattdessen der obige als [ "Contoso.Security.BearerToken", "v1" ] angegeben werden können. Dies ermöglicht die Schaffung einer Hierarchie von Zwecken und öffnet die Möglichkeit von Mehrinstanzenszenarien mit dem Datenschutzsystem.

Warnung

Komponenten sollten nicht zulassen, dass nicht vertrauenswürdige Benutzereingaben die einzige Eingabequelle für die Zweckkette sind.

Betrachten Sie beispielsweise eine Komponente "Contoso.Messaging.SecureMessage", die für das Speichern sicherer Nachrichten verantwortlich ist. Wenn die Secure Messaging-Komponente CreateProtector([ username ]) aufgerufen würde, könnte ein böswilliger Nutzer ein Konto mit dem Benutzernamen "Contoso.Security.BearerToken" erstellen, um zu versuchen, die Komponente dazu zu bringen, CreateProtector([ "Contoso.Security.BearerToken" ]) aufzurufen und dadurch versehentlich Nutzlasten zu erzeugen, die als Authentifizierungstoken wahrgenommen werden könnten.

Eine bessere Zweckkette für die Messagingkomponente wäre CreateProtector([ "Contoso.Messaging.SecureMessage", $"User: {username}" ]), was eine ordnungsgemäße Isolierung bietet.

Die Isolation und das Verhalten von IDataProtectionProvider, IDataProtector und deren Zwecke sind wie folgt:

  • Für ein bestimmtes IDataProtectionProvider Objekt erstellt die CreateProtector Methode ein IDataProtector Objekt, das eindeutig an das IDataProtectionProvider Objekt gebunden ist, das es erstellt hat, und den Zweckparameter, der an die Methode übergeben wurde.

  • Der Zweckparameter darf nicht null sein. (Wenn Zwecke als Array angegeben werden, bedeutet dies, dass das Array nicht von null Länge sein darf und alle Elemente des Arrays ungleich Null sein müssen.) Ein leerer Zeichenfolgenzweck ist technisch zulässig, wird jedoch abgeraten.

  • Zwei Zweckargumente sind genau dann gleichwertig, wenn sie dieselben Zeichenfolgen (unter Verwendung eines ordinalen Vergleichers) in derselben Reihenfolge enthalten. Ein einzelnes Zweckargument entspricht dem entsprechenden Array für Einzelelementzwecke.

  • Zwei IDataProtector Objekte sind gleichwertig, wenn sie nur dann aus entsprechenden IDataProtectionProvider Objekten mit entsprechenden Zweckparametern erstellt werden.

  • Bei einem bestimmten IDataProtector Objekt gibt ein Aufruf Unprotect(protectedData) das Original unprotectedData zurück, wenn und nur, wenn protectedData := Protect(unprotectedData) es für ein entsprechendes IDataProtector Objekt gilt.

Hinweis

Wir berücksichtigen nicht den Fall, in dem einige Komponenten absichtlich eine Zweckzeichenfolge auswählen, die bekanntermaßen mit einer anderen Komponente in Konflikt steht. Eine solche Komponente wird im Wesentlichen als böswillig betrachtet, und dieses System soll keine Sicherheitsgarantien bereitstellen, wenn bösartiger Code bereits innerhalb des Arbeitsprozesses ausgeführt wird.