Speichern asymmetrischer Schlüssel 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 Sie einen privaten Schlüssel speichern möchten, verwenden Sie einen Schlüsselcontainer. Weitere Informationen zu Schlüsselcontainern finden Sie unter RSA-Schlüsselcontainer auf Computerebene und Benutzerebene.

Hinweis

Der Code in diesem Artikel gilt für Windows und nutzt Features, die erst ab .NET Core 2.2 verfügbar sind. Weitere Informationen finden Sie unter dotnet/runtime#23391.

Erstellen eines asymmetrischen Schlüssels und Speichern des Schlüssels in einem Schlüsselcontainer

  1. Erstellen Sie eine neue Instanz einer CspParameters-Klasse, und übergeben Sie den gewünschten Namen des Schlüsselcontainers an das CspParameters.KeyContainerName-Feld.

  2. Erstellen Sie eine neue Instanz einer Klasse, die von der AsymmetricAlgorithm-Klasse abgeleitet ist (üblicherweise RSACryptoServiceProvider oder DSACryptoServiceProvider), und übergeben Sie das zuvor erstellte CspParameters-Objekt an ihren Konstruktor.

Hinweis

Das Erstellen und Abrufen eines asymmetrischen Schlüssels ist ein einzelner Vorgang. Ist ein Schlüssel noch nicht im Container vorhanden, wird er erstellt, bevor er zurückgegeben wird.

Löschen des Schlüssels aus dem Schlüsselcontainer

  1. Erstellen Sie eine neue Instanz einer CspParameters-Klasse, und übergeben Sie den gewünschten Namen des Schlüsselcontainers an das CspParameters.KeyContainerName-Feld.

  2. Erstellen Sie eine neue Instanz einer Klasse, die von der AsymmetricAlgorithm-Klasse abgeleitet ist (üblicherweise RSACryptoServiceProvider oder DSACryptoServiceProvider), und übergeben Sie das zuvor erstellte CspParameters-Objekt an ihren Konstruktor.

  3. Legen Sie die Eigenschaft RSACryptoServiceProvider.PersistKeyInCsp oder DSACryptoServiceProvider.PersistKeyInCsp der von AsymmetricAlgorithm abgeleiteten Klasse auf false (bzw. in Visual Basic auf False) fest.

  4. Rufen Sie die Clear-Methode der von AsymmetricAlgorithm abgeleiteten Klasse auf. Diese Methode gibt alle Ressourcen der Klasse frei und löscht den Schlüsselcontainer.

Beispiel

Das folgende Beispiel zeigt, wie Sie einen asymmetrischen Schlüssel erstellen, ihn in einem Schlüsselcontainer speichern, den Schlüssel zu einem späteren Zeitpunkt abrufen und den Schlüssel aus dem Container löschen.

Beachten Sie, dass der Code in der GenKey_SaveInContainer-Methode und der GetKeyFromContainer-Methode ähnlich ist. Wenn Sie einen Schlüsselcontainernamen für ein CspParameters-Objekt angeben und ihn an ein AsymmetricAlgorithm-Objekt übergeben, dessen Eigenschaft PersistKeyInCsp oder PersistKeyInCsp auf true festgelegt ist, passiert Folgendes:

  • Wenn kein Schlüsselcontainer mit dem angegebenen Namen vorhanden ist, wird einer erstellt und der Schlüssel wird beibehalten.
  • Wenn ein Schlüsselcontainer mit dem angegebenen Namen vorhanden ist, wird der der Schlüssel im Container automatisch in der aktuelle AsymmetricAlgorithm-Objekt geladen.

Daher behält der Code in der GenKey_SaveInContainer-Methode den Schlüssel bei, weil sie zuerst ausgeführt wird, während der Code in der GetKeyFromContainer-Methode den Schlüssel lädt, weil sie als zweites ausgeführt wird.

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.");
    }
}

Die Ausgabe lautet wie folgt:

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.

Siehe auch