Cómo: Almacenar claves asimétricas en un contenedor de claves
Actualización: noviembre 2007
Las claves privadas asimétricas nunca deben almacenarse literalmente o en texto sin cifrar en el equipo local. Si debe almacenar una clave privada, utilice un contenedor de claves. Para obtener más información sobre contenedores de claves, vea la sección CryptoAPI de la documentación de Platform SDK en la dirección https://msdn.microsoft.com.
Para crear una clave asimétrica y guardarla en un contenedor de claves
Cree una nueva instancia de una clase CspParameters y pase al campo CspParameters.KeyContainerName el nombre con el que desea llamar al contenedor de claves.
Cree una nueva instancia de una clase que derive de la clase AsymmetricAlgorithm (normalmente RSACryptoServiceProvider o DSACryptoServiceProvider) y pase el objeto CspParameters creado previamente a su constructor.
Para eliminar una clave de un contenedor de claves
Cree una nueva instancia de una clase CspParameters y pase el nombre que desea asignar al contenedor de claves al campo CspParameters.KeyContainerName.
Cree una nueva instancia de una clase que derive de la clase AsymmetricAlgorithm (normalmente RSACryptoServiceProvider o DSACryptoServiceProvider) y pase el objeto CspParameters creado previamente a su constructor.
Establezca la propiedad PersistKeyInCSP de la clase que deriva de AsymmetricAlgorithm en false (False en Visual Basic).
Llame al método Clear de la clase que deriva de AsymmetricAlgorithm. Este método libera todos los recursos de la clase y vacía el contenedor de claves.
Ejemplo
En el ejemplo siguiente se muestra cómo crear una clave asimétrica, guardarla en un contenedor de claves, recuperar la clave posteriormente y eliminarla del contenedor.
Observe cómo el código del método GenKey_SaveInContainer y el del método GetKeyFromContainer son similares. Cuando se especifica el nombre de un contenedor de claves para un objeto CspParameters y se pasa a un objeto AsymmetricAlgorithm con la propiedad PersistKeyInCsp o la propiedad PersistKeyInCsp establecida en true, ocurre lo siguiente: Si no existe un contenedor de claves con el nombre especificado, se creará uno y se conservará la clave. Si existe un contenedor de claves con el nombre especificado, la clave del contenedor se cargará automáticamente en el objeto AsymmetricAlgorithm actual. Por consiguiente, el código del método GenKey_SaveInContainer conservará la clave porque se ejecuta en primer lugar, mientras que el código del método GetKeyFromContainer cargará la clave, ya que se ejecuta en segundo lugar.
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.
Vea también
Conceptos
Generar claves para cifrar y descifrar