Dela via


Lagra asymmetriska nycklar i en nyckelcontainer

Asymmetriska privata nycklar ska aldrig lagras ordagrant eller i oformaterad text på den lokala datorn. Om du behöver lagra en privat nyckel använder du en nyckelcontainer. Mer information om nyckelcontainrar finns i Förstå RSA-nyckelcontainrar på datornivå och användarnivå.

Kommentar

Koden i den här artikeln gäller för Windows och använder funktioner som inte är tillgängliga i .NET Core 2.2 och tidigare versioner. Mer information finns i dotnet/runtime#23391.

Skapa en asymmetrisk nyckel och spara den i en nyckelcontainer

  1. Skapa en ny instans av en CspParameters klass och skicka det namn som du vill anropa nyckelcontainern till fältet CspParameters.KeyContainerName .

  2. Skapa en ny instans av en klass som härleds från AsymmetricAlgorithm klassen (vanligtvis RSACryptoServiceProvider eller DSACryptoServiceProvider) och skicka det tidigare skapade CspParameters objektet till konstruktorn.

Kommentar

Skapande och hämtning av en asymmetrisk nyckel är en åtgärd. Om en nyckel inte redan finns i containern skapas den innan den returneras.

Ta bort nyckeln från nyckelcontainern

  1. Skapa en ny instans av en CspParameters klass och skicka det namn som du vill anropa nyckelcontainern till fältet CspParameters.KeyContainerName .

  2. Skapa en ny instans av en klass som härleds från AsymmetricAlgorithm klassen (vanligtvis RSACryptoServiceProvider eller DSACryptoServiceProvider) och skicka det tidigare skapade CspParameters objektet till konstruktorn.

  3. RSACryptoServiceProvider.PersistKeyInCsp Ange egenskapen eller för DSACryptoServiceProvider.PersistKeyInCsp klassen som härleds från AsymmetricAlgorithm till false (False i Visual Basic).

  4. Anropa metoden för Clear klassen som härleds från AsymmetricAlgorithm. Den här metoden släpper alla resurser i klassen och rensar nyckelcontainern.

Exempel

I följande exempel visas hur du skapar en asymmetrisk nyckel, sparar den i en nyckelcontainer, hämtar nyckeln vid ett senare tillfälle och tar bort nyckeln från containern.

Observera att koden i GenKey_SaveInContainer metoden och GetKeyFromContainer metoden är liknande. När du anger ett namn på en nyckelcontainer för ett CspParameters objekt och skickar det till ett AsymmetricAlgorithm objekt med PersistKeyInCsp egenskapen eller PersistKeyInCsp egenskapen inställd på trueär beteendet följande:

  • Om det inte finns någon nyckelcontainer med det angivna namnet skapas en och nyckeln sparas.
  • Om det finns en nyckelcontainer med det angivna namnet läses nyckeln i containern automatiskt in i det aktuella AsymmetricAlgorithm objektet.

Därför bevarar koden i GenKey_SaveInContainer -metoden nyckeln eftersom den körs först, medan koden i GetKeyFromContainer metoden läser in nyckeln eftersom den körs på andra plats.

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

Utdata är följande:

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.

Se även