CSDNCurrent de:Eigene Client Store bereitstellen

Aus Cryptshare Documentation
Wechseln zu:Navigation, Suche



Einführung

Im bestimmten Situationen kann es sinnvoll sein, auf das Erstellen einer "client.store" Datei zur Aufbewahrung von Verifizierungsdaten zu verzichten. Um dieses Szenario zu unterstützen, bieten wir verschiedene Möglichkeiten an, die Verifizierungsdaten sicher aufzubewahren. Untenstehend finden Sie ein Diagramm, welches die Klassen und Interfaces veranschaulicht, die Sie zum Bereitstellen eines benutzerdefinierten `IStore` verwenden können. 58294699.png

IStore

Interface

Standardmäßig wird eine Client Instanz durch das Übergeben einer E-Mail-Adresse, einer Cryptshare Web Service URI, sowie ein Pfad zu einer Client Store, welche den Verifizierungszustand jedes einzelnen Benutzers aufbewahrt und mithilfe der Microsoft Data Protection API (DPAPI) geschützt wird, erstellt. Es gibt jedoch auch die Möglichkeit, ein benutzerdefiniertes `IStore` zu übergeben, welches die Methoden `GetValue`, `SetValue`, `RemoveValue` und `Persist` implementiert. Dies könnte beispielsweise dann nützlich sein, wenn Sie den Verifizierungszustand in einer Datenbank oder einem anderen Ort ablegen möchten und eine benutzerdefinierte Implementierung für die jeweilige Methode anbieten. Wir stellen für das `IStore` die Referenzimplementierung `ProtectedFileStore` bereit, welche auch intern genutzt wird, um den Inhalt der Client Store mithilfe der DPAPI zu schützen.

Implementierung

Das `ProtectedFileStore` ist eine Referenzimplementierung für das `IStore` und führt, zusätzlich zur Implementierung der `IStore` Methoden, den `IProtectionService` ein. Dieser Service kapselt das Schützen der Daten von der Datenablage und ermöglicht Ihnen beispielsweise die Angabe einer Verschlüsselungsmethode, ohne dass Sie eine separate Implementierung für den Datenzugriff anbieten müssen. Das `ProtectedFileStore` stellt die statische Methode `Load` bereit, die zusätzlich zum Dateipfad auch ein `IProtectionService` akzeptiert, welcher den zu nutzenden Schutzmechanismus definiert. Wenn kein `IProtectionService` übergeben wird, wird standardmäßig der `DpApiProtectionService` verwendet (diese Vorgehensweise wird intern genutzt, wenn Sie einen `Client` mit einem Dateipfad statt `IStore` instanzieren). Wenn Sie mehr Kontrolle darüber haben möchten, wie die Client Store geschützt werden soll, können Sie auch einen eigenen `IProtectionService` bereitstellen, für den wir auch eine Referenzimplementierung anbieten, um den gängigsten Use Case abzudecken.

IProtectionService

Interface

Der `IProtectionService` beschreibt das allgemeinen Konzept des Schutzes eines Byte-Arrays über die jeweiligen Methoden `Protect` und `Unprotect`. Der Service kommt primär in der `IStore` Referenzimplementierung `ProtectedFileStore` zum Einsatz - der Inhalt der Datei wird geschützt, sobald `IStore.Persist` aufgerufen wird und der Schutz wird aufgehoben, sobald `ProtectedFileStore.Load` aufgerufen wird. Die Cryptshare .NET API nutzt standardmäßig die Microsoft Data Protection API via den `DpApiProtectionService`, bietet jedoch auch die alternative Implementierung `AesProtectionService` an, welche den AES Verschlüsselungsalgorithmus nutzt und Ihnen erlaubt, die Quelle des Schlüssels selbst anzugeben.

Implementierung

The `AesProtectionService` class is an `IProtectionService` implementation and an alternative to the `DpApiProtectionService`. While the latter focuses on ease of use and takes the key management part off your hands, the `AesProtectionService` allows you to specify a custom key source provider. This is especially useful if you want to make use of an already existing key source. You can create an `AesProtectionService` by simply providing it an `IKeySourceProvider` .

IKeySourceProvider

Interface

The `IKeySourceProvider` describes the contract for the implementation of the source material to build a cryptographic key. This key source will be used by the AesProtectionService to en- and decrypt the store content.

Implementierung

Der `AesProtectionService` ist eine Implementierung des `IProtectionService` und stellt eine Alternative zum `DpApiProtectionService` dar. Während sich letzteres auf die einfache Bedienbarkeit fokussiert und die Schlüsselverwaltung übernimmt, erlaubt Ihnen der `AesProtectionService` die Angabe der Quelle des Schlüssels. Dies ist besonders dann nützlich, wenn Sie einen möglicherweise bereits existierenden Schlüssel verwenden möchten. Sie können einen `AesProtectionService` einfach durch die Angabe eines `IKeySourceProviders` erstellen.

Beispiel: Benutzerdefinierte IStore mittels AesProtectionService und MachineGuidKeySourceProvider

Das folgende Programm implementiert ein benutzerdefiniertes `IStore` auf Basis eines `ProtectedFileStore`, welches wiederum zum Schützen des Client Store-Inhalts den `AesProtectionService` und `MachineGuidKeySourceProvider` als Quelle des Schlüssels nutzt.

using Cryptshare.API;
using System;
using System.Globalization;

namespace MachineGuidManualTest
{
	class Program
	{
		static void Main(string[] args)
		{
			try
			{
				IProtectionService protectionService = new AesProtectionService(new MachineGuidKeySourceProvider());
				IStore store = ProtectedFileStore.Open(@"C:\Temp", protectionService);
				var client = new Client(
					"foo@example.com",
					CultureInfo.GetCultureInfo("en"),
					new CryptshareConnection(new WebServiceUri("https://cryptshare.example.com")),
					store
				);
				CheckVerificationResult cvr = client.CheckVerification();
				if (!cvr.Verified)
				{
					client.RequestSenderVerification();
					Console.WriteLine($"A verification code has been sent to '{client.UserEmailAddress}'; please enter the code below and confirm with [Enter]:");
					client.ConfirmSenderVerification(Console.ReadLine().Trim());
				}
				else
				{
					Console.WriteLine($"The sender '{client.UserEmailAddress}' is verified; the client ID is:");
					Console.WriteLine(client.ClientId);
				}
			}
			catch (Exception e)
			{
				Console.Error.WriteLine("An error has occurred: " + e);
			}
			finally
			{
				Console.WriteLine("Press any key to terminate the program.");
				Console.ReadKey();
			}
		}
	}
}