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
Skapa en ny instans av en CspParameters klass och skicka det namn som du vill anropa nyckelcontainern till fältet CspParameters.KeyContainerName .
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
Skapa en ny instans av en
CspParameters
klass och skicka det namn som du vill anropa nyckelcontainern till fältet CspParameters.KeyContainerName .Skapa en ny instans av en klass som härleds från AsymmetricAlgorithm klassen (vanligtvis
RSACryptoServiceProvider
ellerDSACryptoServiceProvider
) och skicka det tidigare skapadeCspParameters
objektet till konstruktorn.RSACryptoServiceProvider.PersistKeyInCsp Ange egenskapen eller för DSACryptoServiceProvider.PersistKeyInCsp klassen som härleds från
AsymmetricAlgorithm
tillfalse
(False
i Visual Basic).Anropa metoden för
Clear
klassen som härleds frånAsymmetricAlgorithm
. 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.