키 컨테이너에 비대칭 키 저장
비대칭 프라이빗 키는 로컬 컴퓨터에 축자로 저장하거나 일반 텍스트로 저장해서는 안 됩니다. 프라이빗 키를 저장해야 하는 경우 키 컨테이너를 사용합니다. 키 컨테이너에 대한 자세한 내용은 컴퓨터 수준 및 사용자 수준 RSA 키 컨테이너 이해를 참조하세요.
참고 항목
이 문서의 코드는 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 개체에 대한 키 컨테이너 이름을 지정하고 이를 PersistKeyInCsp 속성 집합 또는 PersistKeyInCsp 속성 집합이 true
로 설정된 AsymmetricAlgorithm 개체에 전달하는 경우 동작은 다음과 같습니다.
- 지정된 이름의 키 컨테이너가 없는 경우 해당 이름의 키 컨테이너가 만들어지고 키가 지속됩니다.
- 지정된 이름의 키 컨테이너가 있는 경우 컨테이너의 키가 현재 AsymmetricAlgorithm 개체에 자동으로 로드됩니다.
따라서 GenKey_SaveInContainer
메서드의 코드는 첫 번째로 실행되었기 때문에 키를 지속하는 반면, 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