Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Asymetryczne klucze prywatne nigdy nie powinny być przechowywane dosłownie ani w postaci zwykłego tekstu na komputerze lokalnym. Jeśli musisz przechowywać klucz prywatny, użyj kontenera kluczy. Aby uzyskać więcej informacji na temat kontenerów kluczy, zobacz Opis kontenerów kluczy RSA na poziomie maszyny i na poziomie użytkownika.
Uwaga
Kod w tym artykule dotyczy systemu Windows i używa funkcji, które nie są dostępne na platformie .NET Core 2.2 i starszych wersjach. Aby uzyskać więcej informacji, zobacz dotnet/runtime#23391.
Tworzenie klucza asymetrycznego i zapisywanie go w kontenerze kluczy
Utwórz nowe wystąpienie CspParameters klasy i przekaż nazwę, którą chcesz wywołać kontener kluczy do CspParameters.KeyContainerName pola.
Utwórz nowe wystąpienie klasy pochodzącej z AsymmetricAlgorithm klasy (zwykle RSACryptoServiceProvider lub DSACryptoServiceProvider) i przekaż wcześniej utworzony
CspParameters
obiekt do konstruktora.
Uwaga
Tworzenie i pobieranie klucza asymetrycznego to jedna operacja. Jeśli klucz nie znajduje się jeszcze w kontenerze, zostanie utworzony przed zwróceniem.
Usuwanie klucza z kontenera kluczy
Utwórz nowe wystąpienie
CspParameters
klasy i przekaż nazwę, którą chcesz wywołać kontener kluczy do CspParameters.KeyContainerName pola.Utwórz nowe wystąpienie klasy pochodzącej z AsymmetricAlgorithm klasy (zwykle
RSACryptoServiceProvider
lubDSACryptoServiceProvider
) i przekaż wcześniej utworzonyCspParameters
obiekt do konstruktora.RSACryptoServiceProvider.PersistKeyInCsp Ustaw właściwość lub DSACryptoServiceProvider.PersistKeyInCsp klasy pochodzącej z
AsymmetricAlgorithm
klasy nafalse
(False
w Visual Basic).Wywołaj metodę
Clear
klasy, która pochodzi z klasyAsymmetricAlgorithm
. Ta metoda zwalnia wszystkie zasoby klasy i czyści kontener kluczy.
Przykład
W poniższym przykładzie pokazano, jak utworzyć klucz asymetryczny, zapisać go w kontenerze kluczy, pobrać klucz w późniejszym czasie i usunąć klucz z kontenera.
Zwróć uwagę, że kod w metodzie GenKey_SaveInContainer
i metodzie GetKeyFromContainer
jest podobny. Po określeniu nazwy kontenera klucza dla CspParameters obiektu i przekazaniu go do AsymmetricAlgorithm obiektu z PersistKeyInCsp właściwością lub PersistKeyInCsp właściwością ustawioną na true
, zachowanie jest następujące:
- Jeśli kontener kluczy o określonej nazwie nie istnieje, zostanie utworzony, a klucz zostanie utrwalone.
- Jeśli kontener kluczy o określonej nazwie istnieje, klucz w kontenerze zostanie automatycznie załadowany do bieżącego AsymmetricAlgorithm obiektu.
W związku z tym kod w metodzie GenKey_SaveInContainer
utrwala klucz, ponieważ jest uruchamiany jako pierwszy, podczas gdy kod w GetKeyFromContainer
metodzie ładuje klucz, ponieważ jest uruchamiany w sekundzie.
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.");
}
}
Wynik jest następujący:
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.