Aracılığıyla paylaş


Asimetrik anahtarları bir anahtar kapsayıcısında depolama

Asimetrik özel anahtarlar yerel bilgisayarda asla oldukları gibi veya düz metin olarak tutulmamalıdır. Özel anahtar depolamanız gerekiyorsa bir anahtar kapsayıcısı kullanın. Anahtar kapsayıcıları hakkında daha fazla bilgi için bkz . Makine düzeyinde ve kullanıcı düzeyinde RSA anahtar kapsayıcılarını anlama.

Not

Bu makaledeki kod Windows için geçerlidir ve .NET Core 2.2 ve önceki sürümlerde bulunmayan özellikleri kullanır. Daha fazla bilgi için bkz . dotnet/runtime#23391.

Asimetrik anahtar oluşturma ve bir anahtar kapsayıcısında kaydetme

  1. Sınıfın yeni bir CspParameters örneğini oluşturun ve anahtar kapsayıcısını CspParameters.KeyContainerName çağırmak istediğiniz adı alana geçirin.

  2. Sınıfından türetilen AsymmetricAlgorithm (genellikle RSACryptoServiceProvider veya DSACryptoServiceProvider) yeni bir sınıf örneği oluşturun ve daha önce oluşturulan CspParameters nesneyi oluşturucusunun içine geçirin.

Not

Asimetrik anahtarın oluşturulması ve alınması tek bir işlemdir. Bir anahtar henüz kapsayıcıda değilse, döndürülmeden önce oluşturulur.

Anahtarı anahtar kapsayıcısından silme

  1. Sınıfın yeni bir CspParameters örneğini oluşturun ve anahtar kapsayıcısını CspParameters.KeyContainerName çağırmak istediğiniz adı alana geçirin.

  2. Sınıfından türetilen AsymmetricAlgorithm (genellikle RSACryptoServiceProvider veya DSACryptoServiceProvider) yeni bir sınıf örneği oluşturun ve daha önce oluşturulan CspParameters nesneyi oluşturucusunun içine geçirin.

  3. RSACryptoServiceProvider.PersistKeyInCsp öğesinden falseAsymmetricAlgorithm türetilen sınıfının veya DSACryptoServiceProvider.PersistKeyInCsp özelliğini (False Visual Basic'te) ayarlayın.

  4. Clear öğesinden AsymmetricAlgorithmtüretilen sınıfının yöntemini çağırın. Bu yöntem sınıfın tüm kaynaklarını serbest bırakır ve anahtar kapsayıcısını temizler.

Örnek

Aşağıdaki örnekte asimetrik anahtarın nasıl oluşturulacağı, anahtar kapsayıcısına nasıl kaydedileceği, anahtarın daha sonra nasıl alınacağı ve kapsayıcıdan nasıl silineceği gösterilmektedir.

yöntemindeki ve yöntemindeki GenKey_SaveInContainer kodun GetKeyFromContainer benzer olduğuna dikkat edin. Bir nesne için CspParameters anahtar kapsayıcı adı belirttiğinizde ve bunu özelliği veya PersistKeyInCsp özelliği olarak ayarlanmış bir AsymmetricAlgorithm nesneye PersistKeyInCsptruegeçirdiğinizde, davranış aşağıdaki gibidir:

  • Belirtilen ada sahip bir anahtar kapsayıcısı yoksa, bir kapsayıcı oluşturulur ve anahtar kalıcı olur.
  • Belirtilen ada sahip bir anahtar kapsayıcısı varsa, kapsayıcıdaki anahtar otomatik olarak geçerli AsymmetricAlgorithm nesneye yüklenir.

Bu nedenle, yöntemdeki GenKey_SaveInContainer kod önce çalıştırıldığından anahtarı kalıcı hale, yöntemdeki GetKeyFromContainer kod ise ikinci çalıştırıldığından anahtarı yükler.

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

Çıktı aşağıdaki şekilde olacaktır:

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.

Ayrıca bkz.