Gewusst wie: Speichern von asymmetrischen Schlüsseln in einem Schlüsselcontainer
Asymmetrische private Schlüssel sollten in keinem Fall in vollem Wortlaut oder in Klartext auf dem lokalen Computer gespeichert werden. Wenn ein privater Schlüssel gespeichert werden muss, sollten Sie einen Schlüsselcontainer verwenden. Weitere Informationen zu Schlüsselcontainern finden Sie unter RSA-Schlüsselcontainer auf Computerebene und Benutzerebene.
So erstellen Sie einen asymmetrischen Schlüssel und speichern ihn in einem Schlüsselcontainer
Erstellen SIe eine neue Instanz einer CspParameters-Klasse, und übergeben Sie den Namen des Schlüsselcontainers an das CspParameters.KeyContainerName-Feld.
Erstellen Sie eine neue Instanz einer Klasse, die von der AsymmetricAlgorithm-Klasse abgeleitet ist (normalerweise RSACryptoServiceProvider oder DSACryptoServiceProvider), und übergeben Sie das zuvor erstellte CspParameters-Objekt an den Konstruktor.
So löschen Sie einen Schlüssel aus einem Schlüsselcontainer
Erstellen Sie eine neue Instanz einer CspParameters-Klasse, und übergeben Sie den gewünschten Namen des Schlüsselcontainers an das CspParameters.KeyContainerName-Feld.
Erstellen Sie eine neue Instanz einer Klasse, die von der AsymmetricAlgorithm-Klasse abgeleitet ist (normalerweise RSACryptoServiceProvider oder DSACryptoServiceProvider), und übergeben Sie das zuvor erstellte CspParameters-Objekt an den Konstruktor.
Legen Sie die PersistKeyInCSP-Eigenschaft der von AsymmetricAlgorithm abgeleiteten Klasse auf false (in Visual Basic False) fest.
Rufen Sie die Clear-Methode der von AsymmetricAlgorithm abgeleiteten Klasse auf. Diese Methode gibt alle Ressourcen der Klasse frei und entfernt den Inhalt des Schlüsselcontainers.
Beispiel
Im folgenden Beispiel wird dargestellt, wie ein asymmetrischer Schlüssel erstellt, in einem Schlüsselcontainer gespeichert, zu einem späteren Zeitpunkt abgerufen und aus dem Schlüsselcontainer gelöscht wird.
Beachten Sie, dass der Code in der GenKey_SaveInContainer-Methode und in der GetKeyFromContainer-Methode ähnlich ist. Wenn Sie für ein CspParameters-Objekt einen Schlüsselcontainernamen angeben und ihn an ein AsymmetricAlgorithm-Objekt übergeben, für das die PersistKeyInCsp-Eigenschaft oder die PersistKeyInCsp-Eigenschaft auf true festgelegt ist, tritt Folgendes auf. Wenn kein Schlüsselcontainer mit dem angebenen Namen vorhanden ist, wird ein solcher erstellt und der Schlüssel wird beibehalten. Wenn kein Schlüsselcontainer mit dem angegebenen Namen vorhanden ist, wird der Schlüssel im Container automatisch in das aktuelle AsymmetricAlgorithm-Objekt geladen. Daher behält der Code in der GenKey_SaveInContainer-Methode den Schlüssel bei, da sie zuerst ausgeführt wird, während der Code in der GetKeyFromContainer-Methode den Schlüssel lädt, da sie als zweites ausgeführt wird.
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.");
}
}
Siehe auch
Konzepte
Erzeugen von Schlüsseln für die Ver- und Entschlüsselung