Verschlüsselung von Daten im rest in Windows und Azure mithilfe von ASP.NET Core

Das Datenschutzsystem verwendet standardmäßig einen Ermittlungsmechanismus, um zu bestimmen, wo kryptografische Schlüssel im rest verschlüsselt werden sollen. Der Entwickler kann den Ermittlungsmechanismus überschreiben und manuell angeben, wie Schlüssel im rest verschlüsselt werden sollen.

Warnung

Wenn Sie einen expliziten Speicherort für die Schlüsselspeicherung angeben, deregistriert das Datenschutzsystem den Standardmechanismus für die Verschlüsselung von Schlüsseln im Ruhezustand. Daher werden Schlüssel im rest nicht mehr verschlüsselt. Es wird empfohlen, dass Sie für Produktionsbereitstellungen einen expliziten Schlüsselverschlüsselungsmechanismus angeben. Die Optionen für den Mechanismus zur Verschlüsselung im rest werden in diesem Thema beschrieben.

Azure Key Vault

Um Schlüssel in Azure Key Vault zu speichern, konfigurieren Sie das System mit ProtectKeysWithAzureKeyVault in der Startup-Klasse:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToAzureBlobStorage(new Uri("<blobUriWithSasToken>"))
        .ProtectKeysWithAzureKeyVault("<keyIdentifier>", "<clientId>", "<clientSecret>");
}

Weitere Informationen finden Sie unter Konfigurieren des Schutzes von Daten in ASP.NET Core: ProtectKeysWithAzureKeyVault.

Windows DPAPI

Gilt nur für Windows-Bereitstellungen.

Bei Verwenden von Windows DPAPI wird das Schlüsselmaterial mit CryptProtectData verschlüsselt, ehe es im Speicher gespeichert wird. DPAPI ist ein geeigneter Verschlüsselungsmechanismus für Daten, die nicht außerhalb des aktuellen Computers gelesen werden (obwohl es möglich ist, diese Schlüssel in Active Directory zu sichern). Um die DPAPI-Verschlüsselung für Schlüssel im rest zu konfigurieren, rufen Sie eine der ProtectKeysWithDpapi-Erweiterungsmethoden auf:

public void ConfigureServices(IServiceCollection services)
{
    // Only the local user account can decrypt the keys
    services.AddDataProtection()
        .ProtectKeysWithDpapi();
}

Wenn ProtectKeysWithDpapi ohne Parameter aufgerufen wird, kann nur das aktuelle Windows-Benutzerkonto den gespeicherten Schlüsselring entschlüsseln. Optional können Sie angeben, dass jedes Benutzerkonto auf dem Computer (nicht nur das aktuelle Benutzerkonto) den Schlüsselring entschlüsseln kann:

public void ConfigureServices(IServiceCollection services)
{
    // All user accounts on the machine can decrypt the keys
    services.AddDataProtection()
        .ProtectKeysWithDpapi(protectToLocalMachine: true);
}

X.509-Zertifikat

Wenn die App auf mehrere Computer verteilt ist, kann es sinnvoll sein, ein gemeinsam genutztes X.509-Zertifikat auf die Computer zu verteilen und die gehosteten Apps so zu konfigurieren, dass das Zertifikat für die Verschlüsselung von Schlüsseln im rest verwendet wird:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .ProtectKeysWithCertificate("3BCE558E2AD3E0E34A7743EAB5AEA2A9BD2575A0");
}

Aufgrund von .NET Framework-Einschränkungen werden nur Zertifikate mit privaten CAPI-Schlüsseln unterstützt. Nachstehend finden Sie mögliche Umgehungen dieser Einschränkungen.

Windows DPAPI-NG

Dieser Mechanismus ist nur ab Windows 8/Windows Server 2012 verfügbar.

Ab Windows 8 wird DPAPI-NG (auch CNG DPAPI genannt) vom Windows-Betriebssystem unterstützt. Weitere Informationen finden Sie unter Informationen zu CNG DPAPI.

Der Prinzipal ist als Schutzdeskriptorregel codiert. Im folgenden Beispiel, in dem ProtectKeysWithDpapiNG aufgerufen wird, kann nur der in die Domäne eingebundene Benutzer mit der angegebenen SID den Schlüsselring entschlüsseln:

public void ConfigureServices(IServiceCollection services)
{
    // Uses the descriptor rule "SID=S-1-5-21-..."
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG("SID=S-1-5-21-...",
        flags: DpapiNGProtectionDescriptorFlags.None);
}

Es gibt auch eine parameterlose Überladung von ProtectKeysWithDpapiNG. Verwenden Sie diese bequeme Methode, um die Regel SID={CURRENT_ACCOUNT_SID} anzugeben, wobei CURRENT_ACCOUNT_SID die SID des aktuellen Windows-Benutzerkontos ist:

public void ConfigureServices(IServiceCollection services)
{
    // Use the descriptor rule "SID={current account SID}"
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG();
}

In diesem Szenario ist der AD-Domänencontroller für die Verteilung der von den DPAPI-NG-Vorgängen verwendeten Verschlüsselungsschlüssel zuständig. Der Zielbenutzer kann die verschlüsselten Nutzdaten auf jedem in die Domäne eingebundenen Computer entschlüsseln (vorausgesetzt, der Prozess wird unter seiner identity ausgeführt).

Zertifikatbasierte Verschlüsselung mit Windows DPAPI-NG

Wenn die App unter Windows 8.1/Windows Server 2012 R2 oder höher ausgeführt wird, können Sie Windows DPAPI-NG für eine zertifikatbasierte Verschlüsselung verwenden. Verwenden Sie die Zeichenfolge mit dem Regeldeskriptor CERTIFICATE=HashId:THUMBPRINT, wobei THUMBPRINT der hexadezimal codierte SHA1-Fingerabdruck des Zertifikats ist:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG("CERTIFICATE=HashId:3BCE558E2...B5AEA2A9BD2575A0",
            flags: DpapiNGProtectionDescriptorFlags.None);
}

Jede App, die auf dieses Repository verweist, muss unter Windows 8.1/Windows Server 2012 R2 oder höher ausgeführt werden, um die Schlüssel zu entschlüsseln.

Verschlüsselung benutzerdefinierter Schlüssel

Wenn die integrierten Mechanismen nicht geeignet sind, kann der Entwickler einen eigenen Mechanismus zur Schlüsselverschlüsselung festlegen, indem er einen benutzerdefinierten IXmlEncryptor bereitstellt.