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
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.
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
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.Sınıfından türetilen AsymmetricAlgorithm (genellikle
RSACryptoServiceProvider
veyaDSACryptoServiceProvider
) yeni bir sınıf örneği oluşturun ve daha önce oluşturulanCspParameters
nesneyi oluşturucusunun içine geçirin.RSACryptoServiceProvider.PersistKeyInCsp öğesinden
false
AsymmetricAlgorithm
türetilen sınıfının veya DSACryptoServiceProvider.PersistKeyInCsp özelliğini (False
Visual Basic'te) ayarlayın.Clear
öğesindenAsymmetricAlgorithm
tü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 PersistKeyInCsptrue
geç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.