Freigeben über


Speichern asymmetrischer Schlüssel in einem Schlüsselcontainer

Asymmetrische private Schlüssel sollten niemals im Klartext oder auf dem lokalen Computer gespeichert werden. Wenn Sie einen privaten Schlüssel speichern müssen, verwenden Sie einen Schlüsselcontainer. Weitere Informationen zu Schlüsselcontainern finden Sie unter Grundlegendes zu RSA-Schlüsselcontainern auf Computerebene und Benutzerebene.

Hinweis

Der Code in diesem Artikel bezieht sich auf Windows und verwendet Features, die in .NET Core 2.2 und früheren Versionen nicht verfügbar sind. Weitere Informationen finden Sie unter dotnet/runtime#23391.

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

  1. Erstellen Sie eine neue Instanz einer CspParameters-Klasse, und übergeben Sie den Namen, den Sie dem Schlüsselcontainer geben möchten, 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 deren Konstruktor.

Hinweis

Das Erstellen und Abrufen eines asymmetrischen Schlüssels ist ein Vorgang. Wenn sich ein Schlüssel noch nicht im Container befindet, 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 Namen, den Sie dem Schlüsselcontainer geben möchten, an das CspParameters.KeyContainerName Feld.

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

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

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

Beispiel

Im folgenden Beispiel wird veranschaulicht, 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 Code in der GenKey_SaveInContainer Methode und der GetKeyFromContainer Methode ähnlich ist. Wenn Sie einen Schlüsselcontainernamen für ein CspParameters Objekt angeben und es an ein AsymmetricAlgorithm Objekt übergeben, auf das die PersistKeyInCsp Eigenschaft oder die PersistKeyInCsp Eigenschaft auf true festgelegt ist, verhält sich das wie folgt:

  • Wenn kein Schlüsselcontainer mit dem angegebenen Namen vorhanden ist, wird ein Container erstellt, und der Schlüssel wird beibehalten.
  • Wenn ein 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 er zuerst ausgeführt wird, während der Code in der GetKeyFromContainer Methode den Schlüssel lädt, da er zweitens 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