Verschlüsselung ruhender Schlüssel in Windows und Azure mithilfe ASP.net CoreKey encryption at rest in Windows and Azure using ASP.NET Core

Das Datenschutzsystem setzt standardmäßig einen Ermittlungs Mechanismus ein , um zu bestimmen, wie kryptografische Schlüssel im Ruhezustand verschlüsselt werden sollen.The data protection system employs a discovery mechanism by default to determine how cryptographic keys should be encrypted at rest. Der Entwickler kann den Ermittlungs Mechanismus überschreiben und manuell angeben, wie Schlüssel im Ruhezustand verschlüsselt werden sollen.The developer can override the discovery mechanism and manually specify how keys should be encrypted at rest.

Warnung

Wenn Sie einen expliziten Speicherort für die Schlüssel Persistenzangeben, hebt das Datenschutzsystem die Standardverschlüsselung im Ruhezustand auf.If you specify an explicit key persistence location, the data protection system deregisters the default key encryption at rest mechanism. Folglich werden Schlüssel im Ruhezustand nicht mehr verschlüsselt.Consequently, keys are no longer encrypted at rest. Es wird empfohlen, dass Sie einen expliziten Schlüssel Verschlüsselungsmechanismus für Produktions Bereitstellungen angeben.We recommend that you specify an explicit key encryption mechanism for production deployments. Die Optionen für die Verschlüsselung ruhender Mechanismen werden in diesem Thema beschrieben.The encryption-at-rest mechanism options are described in this topic.

Azure Key VaultAzure Key Vault

Um Schlüssel in Azure Key Vaultzu speichern, konfigurieren Sie das System mit protectkeyswithazurekeyvault in der- Startup Klasse:To store keys in Azure Key Vault, configure the system with ProtectKeysWithAzureKeyVault in the Startup class:

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

Weitere Informationen finden Sie unter Konfigurieren von ASP.net Core Datenschutz: protectkeyswithazurekeyvault.For more information, see Configure ASP.NET Core Data Protection: ProtectKeysWithAzureKeyVault.

Windows-DPAPIWindows DPAPI

Gilt nur für Windows-bereit Stellungen.Only applies to Windows deployments.

Bei Verwendung von Windows DPAPI wird das Schlüsselmaterial mit " CryptProtectData " verschlüsselt, bevor es im Speicher gespeichert wird.When Windows DPAPI is used, key material is encrypted with CryptProtectData before being persisted to storage. DPAPI ist ein geeigneter Verschlüsselungsmechanismus für Daten, die nie außerhalb des aktuellen Computers gelesen werden (obwohl es möglich ist, diese Schlüssel bis Active Directory zu sichern. Weitere Informationen finden Sie unter DPAPI und Roamingprofile).DPAPI is an appropriate encryption mechanism for data that's never read outside of the current machine (though it's possible to back these keys up to Active Directory; see DPAPI and Roaming Profiles). Um die Verschlüsselung für den DPAPI-Schlüssel für die Verschlüsselung zu konfigurieren, wenden Sie eine der protectkeyswithdpapi -Erweiterungs Methoden an:To configure DPAPI key-at-rest encryption, call one of the ProtectKeysWithDpapi extension methods:

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 persistenten Schlüsselring entschlüsseln.If ProtectKeysWithDpapi is called with no parameters, only the current Windows user account can decipher the persisted key ring. Optional können Sie angeben, dass jedes Benutzerkonto auf dem Computer (nicht nur das aktuelle Benutzerkonto) in der Lage sein soll, den Schlüsselring zu entschlüsseln:You can optionally specify that any user account on the machine (not just the current user account) be able to decipher the key ring:

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

X.509-ZertifikatX.509 certificate

Wenn die APP auf mehrere Computer verteilt ist, ist es möglicherweise bequem, ein frei gegebenes X. 509-Zertifikat auf den Computern zu verteilen und die gehosteten apps so zu konfigurieren, dass das Zertifikat für die Verschlüsselung der Schlüssel im Ruhezustand verwendet wird:If the app is spread across multiple machines, it may be convenient to distribute a shared X.509 certificate across the machines and configure the hosted apps to use the certificate for encryption of keys at rest:

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

Aufgrund .NET Framework Einschränkungen werden nur Zertifikate mit privaten CAPI-Schlüsseln unterstützt.Due to .NET Framework limitations, only certificates with CAPI private keys are supported. In den folgenden Inhalten finden Sie mögliche Problem Umgehungen für diese Einschränkungen.See the content below for possible workarounds to these limitations.

Windows-DPAPI-ngWindows DPAPI-NG

Dieser Mechanismus ist nur unter Windows 8/Windows Server 2012 oder höher verfügbar.This mechanism is available only on Windows 8/Windows Server 2012 or later.

Ab Windows 8 unterstützt das Windows-Betriebssystem DPAPI-ng (auch CNG DPAPI genannt).Beginning with Windows 8, Windows OS supports DPAPI-NG (also called CNG DPAPI). Weitere Informationen finden Sie unter Informationen zu CNG DPAPI.For more information, see About CNG DPAPI.

Der Prinzipal wird als Schutz beschreibungsregel codiert.The principal is encoded as a protection descriptor rule. Im folgenden Beispiel, in dem protectkeyswithdpapingaufgerufen wird, kann nur der in die Domäne eingebundenen Benutzer mit der angegebenen SID den Schlüsselbund entschlüsseln:In the following example that calls ProtectKeysWithDpapiNG, only the domain-joined user with the specified SID can decrypt the key ring:

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 .There's also a parameterless overload of ProtectKeysWithDpapiNG. Verwenden Sie diese Hilfsmethode, um die Regel "sid = {CURRENT_ACCOUNT_SID}" anzugeben, wobei CURRENT_ACCOUNT_SID die SID des aktuellen Windows-Benutzerkontos ist:Use this convenience method to specify the rule "SID={CURRENT_ACCOUNT_SID}", where CURRENT_ACCOUNT_SID is the SID of the current Windows user account:

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

In diesem Szenario ist der AD-Domänen Controller für die Verteilung der Verschlüsselungsschlüssel verantwortlich, die von den DPAPI-ng-Vorgängen verwendet werden.In this scenario, the AD domain controller is responsible for distributing the encryption keys used by the DPAPI-NG operations. Der Ziel Benutzer kann die verschlüsselte Nutzlast von einem beliebigen in eine Domäne eingebundenen Computer entschlüsseln (vorausgesetzt, der Prozess wird unter seiner Identität ausgeführt).The target user can decipher the encrypted payload from any domain-joined machine (provided that the process is running under their identity).

Zertifikat basierte Verschlüsselung mit Windows DPAPI-ngCertificate-based encryption with 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 verwenden, um eine Zertifikat basierte Verschlüsselung auszuführen.If the app is running on Windows 8.1/Windows Server 2012 R2 or later, you can use Windows DPAPI-NG to perform certificate-based encryption. Verwenden Sie die Regel Deskriptorzeichenfolge "Certificate = Hashid: Fingerabdruck", wobei " Fingerabdruck " der hexadezimal codierte SHA1-Fingerabdruck des Zertifikats ist:Use the rule descriptor string "CERTIFICATE=HashId:THUMBPRINT", where THUMBPRINT is the hex-encoded SHA1 thumbprint of the certificate:

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

Jede APP, die auf dieses Repository verweist, muss auf Windows 8.1/Windows Server 2012 R2 oder höher ausgeführt werden, um die Schlüssel zu entschlüsseln.Any app pointed at this repository must be running on Windows 8.1/Windows Server 2012 R2 or later to decipher the keys.

Verschlüsselung von benutzerdefinierten SchlüsselnCustom key encryption

Wenn die in-Box-Mechanismen nicht geeignet sind, kann der Entwickler einen eigenen Schlüssel Verschlüsselungsmechanismus angeben, indem er einen benutzerdefinierten ixmlencryptorbereitstellt.If the in-box mechanisms aren't appropriate, the developer can specify their own key encryption mechanism by providing a custom IXmlEncryptor.