Clé de chiffrement au repos dans ASP.NET CoreKey encryption at rest in ASP.NET Core

Le système de protection des données utilise un mécanisme de découverte par défaut pour déterminer les clés de chiffrement comment doivent être chiffrées au repos.The data protection system employs a discovery mechanism by default to determine how cryptographic keys should be encrypted at rest. Le développeur peut remplacer le mécanisme de découverte et spécifier manuellement la façon dont les clés doivent être chiffrées au repos.The developer can override the discovery mechanism and manually specify how keys should be encrypted at rest.

Avertissement

Si vous spécifiez un texte explicite emplacement de persistance de la clé, le système de protection des données annule l’inscription du chiffrement à clé par défaut au mécanisme de rest.If you specify an explicit key persistence location, the data protection system deregisters the default key encryption at rest mechanism. Par conséquent, les clés ne sont plus chiffrés au repos.Consequently, keys are no longer encrypted at rest. Il est recommandé que vous spécifier un mécanisme de chiffrement à clé explicite pour les déploiements de production.We recommend that you specify an explicit key encryption mechanism for production deployments. Les options de mécanisme de chiffrement au repos sont décrits dans cette rubrique.The encryption-at-rest mechanism options are described in this topic.

Azure Key VaultAzure Key Vault

Pour stocker les clés dans Azure Key Vault, configurer le système avec ProtectKeysWithAzureKeyVault dans la Startup classe :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>");
}

Pour plus d’informations, consultez Protection des données configurer ASP.NET Core : ProtectKeysWithAzureKeyVault.For more information, see Configure ASP.NET Core Data Protection: ProtectKeysWithAzureKeyVault.

Windows DPAPIWindows DPAPI

S’applique uniquement aux déploiements de Windows.Only applies to Windows deployments.

Lorsque Windows DPAPI est utilisé, le matériel de clé est chiffré avec CryptProtectData avant d’être rendues persistantes dans le stockage.When Windows DPAPI is used, key material is encrypted with CryptProtectData before being persisted to storage. DPAPI est un mécanisme de chiffrement approprié pour les données qui ne sont jamais lue en dehors de l’ordinateur actuel (Cependant, il est possible de sauvegarder ces clés à Active Directory ; voir DPAPI et les profils itinérants).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). Pour configurer le chiffrement de clé au repos DPAPI, appelez une de la ProtectKeysWithDpapi méthodes d’extension :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();
}

Si ProtectKeysWithDpapi est appelée sans paramètres, seul le compte d’utilisateur Windows actuel peut déchiffrer le key ring persistant.If ProtectKeysWithDpapi is called with no parameters, only the current Windows user account can decipher the persisted key ring. Vous pouvez éventuellement spécifier que n’importe quel compte d’utilisateur sur l’ordinateur (pas seulement le compte d’utilisateur actuel) être en mesure de déchiffrer le key ring :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);
}

Certificat X.509X.509 certificate

Si l’application est répartie sur plusieurs ordinateurs, il peut être pratique de distribuer un certificat X.509 partagé entre les machines et de configurer les applications hébergées pour utiliser le certificat pour le chiffrement des clés au repos :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");
}

En raison des limitations de .NET Framework, seuls les certificats avec clés privées CAPI sont pris en charge.Due to .NET Framework limitations, only certificates with CAPI private keys are supported. Consultez le contenu ci-dessous pour les solutions possibles à ces limitations.See the content below for possible workarounds to these limitations.

Windows DPAPI-NGWindows DPAPI-NG

Ce mécanisme est disponible uniquement sur Windows 8/Windows Server 2012 ou version ultérieure.This mechanism is available only on Windows 8/Windows Server 2012 or later.

À compter de Windows 8, le système d’exploitation Windows prend en charge DPAPI-NG (également appelé CNG DPAPI).Beginning with Windows 8, Windows OS supports DPAPI-NG (also called CNG DPAPI). Pour plus d’informations, consultez sur CNG DPAPI.For more information, see About CNG DPAPI.

Le principal est encodé comme une règle de descripteur de protection.The principal is encoded as a protection descriptor rule. Dans l’exemple suivant appelle ProtectKeysWithDpapiNG, seul l’utilisateur de domaine avec le SID spécifié peut déchiffrer le key ring :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);
}

Il existe également une surcharge sans paramètre de ProtectKeysWithDpapiNG.There's also a parameterless overload of ProtectKeysWithDpapiNG. Utilisez cette méthode pratique pour spécifier la règle « SID = {CURRENT_ACCOUNT_SID} », où CURRENT_ACCOUNT_SID est le SID du compte d’utilisateur Windows actuel :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();
}

Dans ce scénario, le contrôleur de domaine Active Directory est responsable de la distribution de clés de chiffrement utilisées par les opérations de DPAPI-NG.In this scenario, the AD domain controller is responsible for distributing the encryption keys used by the DPAPI-NG operations. L’utilisateur cible peut déchiffrer la charge utile chiffrée à partir de n’importe quel ordinateur joint au domaine (à condition que le processus s’exécute sous leur identité).The target user can decipher the encrypted payload from any domain-joined machine (provided that the process is running under their identity).

Chiffrement par certificat avec Windows DPAPI-NGCertificate-based encryption with Windows DPAPI-NG

Si l’application s’exécute sur Windows 8.1 / Windows Server 2012 R2 ou version ultérieure, vous pouvez utiliser Windows DPAPI-NG pour effectuer un chiffrement par certificat.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. Utiliser la chaîne de descripteur de règle « certificat = HashId:THUMBPRINT », où empreinte est l’empreinte numérique SHA1 codé en hexadécimal du certificat :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);
}

N’importe quelle application pointée vers ce dépôt doit être en cours d’exécution sur Windows 8.1 / Windows Server 2012 R2 ou version ultérieure pour déchiffrer les clés.Any app pointed at this repository must be running on Windows 8.1/Windows Server 2012 R2 or later to decipher the keys.

Clé de chiffrement personnaliséCustom key encryption

Si les mécanismes d’origine ne sont pas appropriées, le développeur peut spécifier leur propre mécanisme de chiffrement à clé en fournissant un personnalisé IXmlEncryptor.If the in-box mechanisms aren't appropriate, the developer can specify their own key encryption mechanism by providing a custom IXmlEncryptor.