Stocker des clés asymétriques dans un conteneur de clés

Les clés privées asymétriques ne doivent jamais être stockées textuellement ou en texte brut sur l'ordinateur local. Si vous avez besoin de stocker une clé privée, utilisez un conteneur de clés. Pour plus d’informations sur les conteneurs de clés, consultez Présentation des conteneurs de clés RSA ordinateur et utilisateur.

Notes

Le code de cet article s’applique à Windows et utilise des fonctionnalités non disponibles dans .NET Core 2.2 et versions antérieures. Pour plus d’informations, consultez dotnet/runtime#23391.

Créer une clé asymétrique et l’enregistrer dans un conteneur de clés

  1. Créez une nouvelle instance d’une classe CspParameters et passez le nom que vous souhaitez donner au conteneur de clés dans le champ CspParameters.KeyContainerName.

  2. Créez une instance d’une classe qui dérive de la classe AsymmetricAlgorithm (généralement RSACryptoServiceProvider ou DSACryptoServiceProvider) et passez l’objet CspParameters créé précédemment à son constructeur.

Notes

La création et la récupération d’une clé asymétrique sont une seule opération. Si une clé n’est pas déjà dans le conteneur, elle est créée avant d’être retournée.

Supprimer la clé du conteneur de clés

  1. Créez une nouvelle instance d’une classe CspParameters et passez le nom que vous souhaitez donner au conteneur de clés dans le champ CspParameters.KeyContainerName.

  2. Créez une instance d’une classe qui dérive de la classe AsymmetricAlgorithm (généralement RSACryptoServiceProvider ou DSACryptoServiceProvider) et passez l’objet CspParameters créé précédemment à son constructeur.

  3. Définissez la RSACryptoServiceProvider.PersistKeyInCsp ou la propriété DSACryptoServiceProvider.PersistKeyInCsp de la classe qui dérive de AsymmetricAlgorithm vers false (False en Visual Basic).

  4. Appelez la méthode Clear de la classe qui dérive de AsymmetricAlgorithm. Cette méthode libère toutes les ressources de la classe et efface le conteneur de clés.

Exemple

L'exemple suivant illustre comment créer une clé asymétrique, l'enregistrer dans un conteneur de clés, récupérer la clé ultérieurement et supprimer la clé du conteneur.

Notez que le code inclus dans la méthode GenKey_SaveInContainer est similaire à celui de la méthode GetKeyFromContainer. Quand vous spécifiez un nom de conteneur de clés pour un objet CspParameters et que vous le passez à un objet AsymmetricAlgorithm avec la propriété PersistKeyInCsp ou la propriété PersistKeyInCsp définie sur true, le comportement est le suivant :

  • S'il n'existe aucun conteneur de clés portant le nom spécifié, un conteneur est créé et la clé est conservée.
  • Si un conteneur de clés portant le nom spécifié existe déjà, la clé incluse dans ce conteneur est automatiquement chargée dans l'objet AsymmetricAlgorithm actuel.

Par conséquent, le code inclus dans la méthode GenKey_SaveInContainer conserve la clé, car il est exécuté en premier, tandis que le code inclus dans la méthode GetKeyFromContainer charge la clé, car il est exécuté en second.

Imports System
Imports System.Security.Cryptography

Public Class StoreKey

    Public Shared Sub Main()
        Try
            ' Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer")

            ' Retrieve the key from the container.
            GetKeyFromContainer("MyKeyContainer")

            ' Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer")

            ' Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer")

            ' Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer")
        Catch e As CryptographicException
            Console.WriteLine(e.Message)
        End Try
    End Sub

    Private Shared Sub GenKey_SaveInContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container
        ' name used to store the RSA key pair.
        Dim parameters As New CspParameters With {
            .KeyContainerName = ContainerName
        }

        ' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container MyKeyContainerName.
        Using rsa As New RSACryptoServiceProvider(parameters)
            ' Display the key information to the console.
            Console.WriteLine($"Key added to container:  {rsa.ToXmlString(True)}")
        End Using
    End Sub

    Private Shared Sub GetKeyFromContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container
        '  name used to store the RSA key pair.
        Dim parameters As New CspParameters With {
            .KeyContainerName = ContainerName
        }

        ' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container MyKeyContainerName.
        Using rsa As New RSACryptoServiceProvider(parameters)
            ' Display the key information to the console.
            Console.WriteLine($"Key retrieved from container : {rsa.ToXmlString(True)}")
        End Using
    End Sub

    Private Shared Sub DeleteKeyFromContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container
        '  name used to store the RSA key pair.
        Dim parameters As New CspParameters With {
            .KeyContainerName = ContainerName
        }

        ' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container.
        ' Delete the key entry in the container.
        Dim rsa As New RSACryptoServiceProvider(parameters) With {
            .PersistKeyInCsp = False
        }

        ' Call Clear to release resources and delete the key from the container.
        rsa.Clear()

        Console.WriteLine("Key deleted.")
    End Sub
End Class
using System;
using System.Security.Cryptography;

public class StoreKey
{
    public static void Main()
    {
        try
        {
            // Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer");

            // Retrieve the key from the container.
            GetKeyFromContainer("MyKeyContainer");

            // Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer");

            // Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer");

            // Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer");
        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.Message);
        }
    }

    private static void GenKey_SaveInContainer(string containerName)
    {
        // Create the CspParameters object and set the key container
        // name used to store the RSA key pair.
        var parameters = new CspParameters
        {
            KeyContainerName = containerName
        };

        // Create a new instance of RSACryptoServiceProvider that accesses
        // the key container MyKeyContainerName.
        using var rsa = new RSACryptoServiceProvider(parameters);

        // Display the key information to the console.
        Console.WriteLine($"Key added to container: \n  {rsa.ToXmlString(true)}");
    }

    private static void GetKeyFromContainer(string containerName)
    {
        // Create the CspParameters object and set the key container
        // name used to store the RSA key pair.
        var parameters = new CspParameters
        {
            KeyContainerName = containerName
        };

        // Create a new instance of RSACryptoServiceProvider that accesses
        // the key container MyKeyContainerName.
        using var rsa = new RSACryptoServiceProvider(parameters);

        // Display the key information to the console.
        Console.WriteLine($"Key retrieved from container : \n {rsa.ToXmlString(true)}");
    }

    private static void DeleteKeyFromContainer(string containerName)
    {
        // Create the CspParameters object and set the key container
        // name used to store the RSA key pair.
        var parameters = new CspParameters
        {
            KeyContainerName = containerName
        };

        // Create a new instance of RSACryptoServiceProvider that accesses
        // the key container.
        using var rsa = new RSACryptoServiceProvider(parameters)
        {
            // Delete the key entry in the container.
            PersistKeyInCsp = false
        };

        // Call Clear to release resources and delete the key from the container.
        rsa.Clear();

        Console.WriteLine("Key deleted.");
    }
}

La sortie se présente comme suit :

Key added to container:
<RSAKeyValue> Key Information A</RSAKeyValue>
Key retrieved from container :
<RSAKeyValue> Key Information A</RSAKeyValue>
Key deleted.
Key added to container:
<RSAKeyValue> Key Information B</RSAKeyValue>
Key deleted.

Voir aussi