Ukládání asymetrických klíčů v kontejneru klíčů
Asymetrické soukromé klíče by nikdy neměly být uloženy doslovně nebo ve formátu prostého textu v místním počítači. Pokud potřebujete uložit privátní klíč, použijte kontejner klíčů. Další informace o kontejnerech klíčů najdete v tématu Principy kontejnerů klíčů RSA na úrovni počítače a na úrovni uživatele.
Poznámka:
Kód v tomto článku platí pro Windows a používá funkce, které nejsou k dispozici v .NET Core 2.2 a starších verzích. Další informace najdete v tématu dotnet/runtime#23391.
Vytvoření asymetrického klíče a jeho uložení do kontejneru klíčů
Vytvořte novou instanci CspParameters třídy a předejte název, který chcete do pole volat kontejner CspParameters.KeyContainerName klíčů.
Vytvořte novou instanci třídy, která je odvozena od AsymmetricAlgorithm třídy (obvykle RSACryptoServiceProvider nebo DSACryptoServiceProvider) a předejte dříve vytvořený
CspParameters
objekt jeho konstruktoru.
Poznámka:
Vytvoření a načtení asymetrického klíče je jedna operace. Pokud klíč ještě není v kontejneru, vytvoří se před vrácením.
Odstranění klíče z kontejneru klíčů
Vytvořte novou instanci
CspParameters
třídy a předejte název, který chcete do pole volat kontejner CspParameters.KeyContainerName klíčů.Vytvořte novou instanci třídy, která je odvozena od AsymmetricAlgorithm třídy (obvykle
RSACryptoServiceProvider
neboDSACryptoServiceProvider
) a předejte dříve vytvořenýCspParameters
objekt jeho konstruktoru.RSACryptoServiceProvider.PersistKeyInCsp Nastavte nebo DSACryptoServiceProvider.PersistKeyInCsp vlastnost třídy, která je odvozena od
AsymmetricAlgorithm
(false
False
v jazyce Visual Basic).Clear
Volání metody třídy, která je odvozena zAsymmetricAlgorithm
. Tato metoda uvolní všechny prostředky třídy a vymaže kontejner klíčů.
Příklad
Následující příklad ukazuje, jak vytvořit asymetrický klíč, uložit ho do kontejneru klíčů, později načíst klíč a odstranit klíč z kontejneru.
Všimněte si, že kód v GenKey_SaveInContainer
metodě a GetKeyFromContainer
metoda je podobný. Když pro objekt zadáte název CspParameters kontejneru klíče a předáte ho PersistKeyInCsp objektu AsymmetricAlgorithm s vlastností nebo PersistKeyInCsp vlastností nastavenou na true
, chování je následující:
- Pokud kontejner klíčů se zadaným názvem neexistuje, vytvoří se kontejner klíčů a klíč se zachovají.
- Pokud existuje kontejner klíčů se zadaným názvem, klíč v kontejneru se automaticky načte do aktuálního AsymmetricAlgorithm objektu.
Proto kód v GenKey_SaveInContainer
metodě zachová klíč, protože se spustí jako první, zatímco kód v GetKeyFromContainer
metodě načte klíč, protože je spuštěn druhý.
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.");
}
}
Výstup je následující:
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.