Comment : stocker des clés asymétriques dans un conteneur de clé
Mise à jour : novembre 2007
Les clés privées asymétriques ne doivent jamais être stockées textuellement ou sous forme de texte brut sur l'ordinateur local. Si vous avez besoin de stocker une clé privée, vous devez utiliser un conteneur de clé. Pour plus d'informations sur les conteneurs de clé, consultez la section CryptoAPI de la documentation du Kit de développement Platform SDK à l'adresse https://www.microsoft.com/france/msdn.
Pour créer une clé asymétrique et l'enregistrer dans un conteneur de clé
Créez une nouvelle instance d'une classe CspParameters et passez le nom que vous voulez attribuer au conteneur de clé au champ CspParameters.KeyContainerName.
Créez une nouvelle instance d'une classe qui dérive de la classe AsymmetricAlgorithm (généralement RSACryptoServiceProvider ou DSACryptoServiceProvider) et passez à son constructeur l'objet CspParameters créé précédemment.
Pour supprimer une clé d'un conteneur de clé
Créez une nouvelle instance d'une classe CspParameters et passez le nom que vous voulez attribuer au conteneur de clé au champ CspParameters.KeyContainerName.
Créez une nouvelle instance d'une classe qui dérive de la classe AsymmetricAlgorithm (généralement RSACryptoServiceProvider ou DSACryptoServiceProvider) et passez à son constructeur l'objet CspParameters créé précédemment.
Assignez à la propriété PersistKeyInCSP de la classe qui dérive de AsymmetricAlgorithm la valeur false (False en Visual Basic).
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é.
Exemple
L'exemple suivant illustre la création d'une clé asymétrique, son enregistrement dans un conteneur de clé, l'extraction de la clé ultérieurement et la suppression de celle-ci du conteneur.
Remarquez que le code contenu dans la méthode GenKey_SaveInContainer et celui figurant dans la méthode GetKeyFromContainer sont similaires. Lorsque vous spécifiez un nom de conteneur de clé pour un objet CspParameters et que vous le passez à un objet AsymmetricAlgorithm tandis que la propriété PersistKeyInCsp ou le jeu de propriétés PersistKeyInCsp porte la valeur true, les opérations suivantes ont lieu. Si aucun conteneur de clé portant le nom spécifié n'existe, un conteneur est créé et la clé est persistante. Si un conteneur de clé portant le nom spécifié existe, la clé figurant dans le conteneur est automatiquement chargée dans l'objet AsymmetricAlgorithm actuel. Par conséquent, le code figurant dans la méthode GenKey_SaveInContainer rend la clé persistante parce qu'il est exécuté en premier, tandis que le code présent dans la méthode GetKeyFromContainer charge la clé parce qu'il est exécuté en deuxième.
Imports System
Imports System.IO
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
Public 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 cp As New CspParameters()
cp.KeyContainerName = ContainerName
' Create a new instance of RSACryptoServiceProvider that accesses
' the key container MyKeyContainerName.
Dim rsa As New RSACryptoServiceProvider(cp)
' Display the key information to the console.
Console.WriteLine("Key added to container: {0}", rsa.ToXmlString(True))
End Sub
Public 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 cp As New CspParameters()
cp.KeyContainerName = ContainerName
' Create a new instance of RSACryptoServiceProvider that accesses
' the key container MyKeyContainerName.
Dim rsa As New RSACryptoServiceProvider(cp)
' Display the key information to the console.
Console.WriteLine("Key retrieved from container : {0}", rsa.ToXmlString(True))
End Sub
Public 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 cp As New CspParameters()
cp.KeyContainerName = ContainerName
' Create a new instance of RSACryptoServiceProvider that accesses
' the key container.
Dim rsa As New RSACryptoServiceProvider(cp)
' Delete the key entry in the container.
rsa.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.IO;
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);
}
}
public static void GenKey_SaveInContainer(string ContainerName)
{
// Create the CspParameters object and set the key container
// name used to store the RSA key pair.
CspParameters cp = new CspParameters();
cp.KeyContainerName = ContainerName;
// Create a new instance of RSACryptoServiceProvider that accesses
// the key container MyKeyContainerName.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
// Display the key information to the console.
Console.WriteLine("Key added to container: \n {0}", rsa.ToXmlString(true));
}
public static void GetKeyFromContainer(string ContainerName)
{
// Create the CspParameters object and set the key container
// name used to store the RSA key pair.
CspParameters cp = new CspParameters();
cp.KeyContainerName = ContainerName;
// Create a new instance of RSACryptoServiceProvider that accesses
// the key container MyKeyContainerName.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
// Display the key information to the console.
Console.WriteLine("Key retrieved from container : \n {0}", rsa.ToXmlString(true));
}
public static void DeleteKeyFromContainer(string ContainerName)
{
// Create the CspParameters object and set the key container
// name used to store the RSA key pair.
CspParameters cp = new CspParameters();
cp.KeyContainerName = ContainerName;
// Create a new instance of RSACryptoServiceProvider that accesses
// the key container.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
// Delete the key entry in the container.
rsa.PersistKeyInCsp = false;
// Call Clear to release resources and delete the key from the container.
rsa.Clear();
Console.WriteLine("Key deleted.");
}
}
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
Concepts
Génération de clés pour le chiffrement et le déchiffrement