Chiffrement de clé au repos dans Windows et Azure à l’aide de ASP.NET Core

Le système de protection des données utilise un mécanisme de découverte par défaut pour déterminer comment les clés de chiffrement doivent être chiffrées au repos. Le développeur peut remplacer le mécanisme de découverte et spécifier manuellement comment les clés doivent être chiffrées au repos.

Avertissement

Si vous spécifiez un emplacement de persistance de clés explicite, le système de protection des données désinscrit le mécanisme de chiffrement de clés au repos par défaut. Par conséquent, les clés ne sont plus chiffrées au repos. Nous vous recommandons de spécifier un mécanisme de chiffrement de clés explicite pour des déploiements de production. Les options de mécanisme de chiffrement au repos sont décrites dans cette rubrique.

Azure Key Vault

Pour stocker des clés dans Azure Key Vault, configurez le système avec ProtectKeysWithAzureKeyVault dans la classe Startup :

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

Pour plus d’informations, consultez Configurer ASP.NET Core protection des données : ProtectKeysWithAzureKeyVault.

Windows DPAPI

S’applique uniquement aux déploiements Windows.

Lorsque Windows DPAPI est utilisé, le matériel clé est chiffré avec CryptProtectData avant d’être conservé dans le stockage. DPAPI est un mécanisme de chiffrement approprié pour les données qui ne sont jamais lues en dehors de l’ordinateur actuel (bien qu’il soit possible de sauvegarder ces clés dans Active Directory). Pour configurer le chiffrement clé au repos DPAPI, appelez l’une des méthodes d’extension ProtectKeysWithDpapi) :

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

Si ProtectKeysWithDpapi est appelé sans paramètres, seul le compte d’utilisateur Windows actuel peut déchiffrer l’anneau de clés persistant. Vous pouvez éventuellement spécifier que n’importe quel compte d’utilisateur sur l’ordinateur (et pas seulement le compte d’utilisateur actuel) peut déchiffrer l’anneau de clés :

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

Certificat X.509

Si l’application est répartie sur plusieurs ordinateurs, il peut être pratique de distribuer un certificat X.509 partagé entre les ordinateurs et de configurer les applications hébergées pour utiliser le certificat pour le chiffrement des clés au repos :

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

En raison des limitations du .NET Framework, seuls les certificats avec des clés privées CAPI sont pris en charge. Consultez le contenu ci-dessous pour obtenir des solutions de contournement possibles à ces limitations.

Windows DPAPI-NG

Ce mécanisme est disponible uniquement sur Windows 8/Windows Server 2012 ou version ultérieure.

À compter de Windows 8, le système d’exploitation Windows prend en charge DPAPI-NG (également appelé CNG DPAPI). Pour plus d’informations, consultez À propos de CNG DPAPI.

Le principal est encodé en tant que règle de descripteur de protection. Dans l’exemple suivant qui appelle ProtectKeysWithDpapiNG, seul l’utilisateur joint à un domaine avec le SID spécifié peut déchiffrer l’anneau de clés :

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. 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 :

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 AD est responsable de la distribution des clés de chiffrement utilisées par les opérations DPAPI-NG. L’utilisateur cible peut déchiffrer la charge utile chiffrée à partir de n’importe quel ordinateur joint à un domaine (à condition que le processus s’exécute sous son identité).

Chiffrement basé sur des certificats avec 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 le chiffrement basé sur les certificats. Utilisez la chaîne de descripteur de règle « CERTIFICATE=HashId:THUMBPRINT », où THUMBPRINT est l’empreinte SHA1 encodée hexadécimale du certificat :

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

Toute application pointée vers ce référentiel doit s’exécuter sur Windows 8.1/Windows Server 2012 R2 ou version ultérieure pour déchiffrer les clés.

Chiffrement à clé personnalisée

Si les mécanismes fournis ne sont pas appropriés, le développeur peut spécifier son propre mécanisme de chiffrement de clés en fournissant un IXmlEncryptor personnalisé.