Delen via


Asymmetrische sleutels opslaan in een sleutelcontainer

Asymmetrische persoonlijke sleutels mogen nooit letterlijk of zonder opmaak op de lokale computer worden opgeslagen. Als u een persoonlijke sleutel wilt opslaan, gebruikt u een sleutelcontainer. Zie RsA-sleutelcontainers op machineniveau en op gebruikersniveau voor meer informatie over sleutelcontainers.

Notitie

De code in dit artikel is van toepassing op Windows en maakt gebruik van functies die niet beschikbaar zijn in .NET Core 2.2 en eerdere versies. Zie dotnet/runtime#23391 voor meer informatie.

Een asymmetrische sleutel maken en opslaan in een sleutelcontainer

  1. Maak een nieuw exemplaar van een CspParameters klasse en geef de naam door die u de sleutelcontainer aan het CspParameters.KeyContainerName veld wilt aanroepen.

  2. Maak een nieuw exemplaar van een klasse die is afgeleid van de AsymmetricAlgorithm klasse (meestal RSACryptoServiceProvider of DSACryptoServiceProvider) en geef het eerder gemaakte CspParameters object door aan de constructor.

Notitie

Het maken en ophalen van een asymmetrische sleutel is één bewerking. Als een sleutel zich nog niet in de container bevindt, wordt deze gemaakt voordat deze wordt geretourneerd.

De sleutel uit de sleutelcontainer verwijderen

  1. Maak een nieuw exemplaar van een CspParameters klasse en geef de naam door die u de sleutelcontainer aan het CspParameters.KeyContainerName veld wilt aanroepen.

  2. Maak een nieuw exemplaar van een klasse die is afgeleid van de AsymmetricAlgorithm klasse (meestal RSACryptoServiceProvider of DSACryptoServiceProvider) en geef het eerder gemaakte CspParameters object door aan de constructor.

  3. Stel de RSACryptoServiceProvider.PersistKeyInCsp eigenschap of de DSACryptoServiceProvider.PersistKeyInCsp eigenschap in van de klasse die is afgeleid van AsymmetricAlgorithmfalse (False in Visual Basic).

  4. Roep de Clear methode aan van de klasse die is afgeleid van AsymmetricAlgorithm. Met deze methode worden alle resources van de klasse vrijgegeven en wordt de sleutelcontainer gewist.

Opmerking

In het volgende voorbeeld ziet u hoe u een asymmetrische sleutel maakt, opslaat in een sleutelcontainer, de sleutel op een later tijdstip ophaalt en de sleutel uit de container verwijdert.

U ziet dat code in de GenKey_SaveInContainer methode en de GetKeyFromContainer methode vergelijkbaar zijn. Wanneer u een sleutelcontainernaam voor een CspParameters object opgeeft en doorgeeft aan een AsymmetricAlgorithm object waarop de PersistKeyInCsp eigenschap of PersistKeyInCsp eigenschap is ingesteld true, is het gedrag als volgt:

  • Als er geen sleutelcontainer met de opgegeven naam bestaat, wordt er een gemaakt en blijft de sleutel behouden.
  • Als er een sleutelcontainer met de opgegeven naam bestaat, wordt de sleutel in de container automatisch in het huidige AsymmetricAlgorithm object geladen.

Daarom blijft de code in de GenKey_SaveInContainer methode de sleutel behouden omdat deze eerst wordt uitgevoerd, terwijl de code in de GetKeyFromContainer methode de sleutel laadt omdat deze tweede wordt uitgevoerd.

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

De uitvoer is als volgt:

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.

Zie ook