キー コンテナーに非対称キーを格納する
非対称秘密キーは、ローカル コンピューターにそのまま平文として保存しないでください。 秘密キーを格納する必要がある場合は、キー コンテナーを使用します。 キー コンテナーの詳細については、「コンピューター レベルおよびユーザー レベルの RSA キー コンテナーについて」を参照してください。
Note
この記事のコードは Windows に適用されます。また、.NET Core 2.2 以前のバージョンでは使用できない機能を使用しています。 詳細については、dotnet/runtime#23391の記事を参照してください。
非対称キーを作成し、キー コンテナーに格納する
CspParameters クラスの新しいインスタンスを作成し、キー コンテナーを呼び出すときに使用する名前を CspParameters.KeyContainerName フィールドに渡します。
AsymmetricAlgorithm クラス (通常は RSACryptoServiceProvider または DSACryptoServiceProvider) から派生するクラスの新しいインスタンスを作成し、以前に作成した
CspParameters
オブジェクトをそのコンストラクターに渡します。
キー コンテナーからキーを削除する
CspParameters
クラスの新しいインスタンスを作成し、キー コンテナーを呼び出すときに使用する名前を CspParameters.KeyContainerName フィールドに渡します。AsymmetricAlgorithm クラス (通常は
RSACryptoServiceProvider
またはDSACryptoServiceProvider
) から派生するクラスの新しいインスタンスを作成し、以前に作成したCspParameters
オブジェクトをそのコンストラクターに渡します。AsymmetricAlgorithm
から派生するクラスの RSACryptoServiceProvider.PersistKeyInCsp または DSACryptoServiceProvider.PersistKeyInCsp プロパティをfalse
(Visual Basic ではFalse
) に設定します。AsymmetricAlgorithm
から派生したクラスのClear
メソッドを呼び出します。 このメソッドは、クラスのすべてのリソースを解放し、キー コンテナーを消去します。
例
非対称キーを作成し、それをキー コンテナーへ格納し、後でキーを取得し、最後にキー コンテナーからキーを削除する方法の例を次に示します。
GenKey_SaveInContainer
メソッドと GetKeyFromContainer
メソッドのコードは類似していることに注意してください。 CspParameters オブジェクトのキー コンテナー名を指定した場合、AsymmetricAlgorithm プロパティまたは PersistKeyInCsp プロパティを true
に設定して、指定したキー コンテナーを PersistKeyInCsp オブジェクトに渡すと、動作は次のようになります。
- 指定した名前のキー コンテナーが存在しない場合、コンテナーが作成されてキーが保持されます。
- 指定した名前のキー コンテナーが存在する場合、そのコンテナー内のキーが現在の AsymmetricAlgorithm オブジェクトに自動的に読み込まれます。
つまり、最初に実行される GenKey_SaveInContainer
メソッドのコードはこのキーを保持し、2 番目に実行される GetKeyFromContainer
メソッドのコードはこのキーを読み込みます。
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.");
}
}
出力は次のようになります。
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.
関連項目
.NET