Share via


키 컨테이너에 비대칭 키 저장

비대칭 프라이빗 키는 로컬 컴퓨터에 축자로 저장하거나 일반 텍스트로 저장해서는 안 됩니다. 프라이빗 키를 저장해야 하는 경우 키 컨테이너를 사용합니다. 키 컨테이너에 대한 자세한 내용은 컴퓨터 수준 및 사용자 수준 RSA 키 컨테이너 이해를 참조하세요.

참고 항목

이 문서의 코드는 Windows에 적용되며 .NET Core 2.2 및 이전 버전에서 사용할 수 없는 기능을 사용합니다. 자세한 내용은 dotnet/runtime#23391를 참조하세요.

비대칭 키를 만들어 키 컨테이너에 저장

  1. CspParameters 클래스의 새 인스턴스를 만들고 키 컨테이너에 지정하려는 이름을 CspParameters.KeyContainerName 필드에 전달합니다.

  2. AsymmetricAlgorithm 클래스(일반적으로 RSACryptoServiceProvider 또는 DSACryptoServiceProvider)에서 파생되는 클래스의 새 인스턴스를 만들고 이전에 만들어진 CspParameters 개체를 해당 생성자에 전달합니다.

참고 항목

비대칭 키 만들기 및 검색은 하나의 작업입니다. 키가 컨테이너에 아직 없으면 반환되기 전에 만들어집니다.

키 컨테이너에서 키 삭제

  1. CspParameters 클래스의 새 인스턴스를 만들고 키 컨테이너에 지정하려는 이름을 CspParameters.KeyContainerName 필드에 전달합니다.

  2. AsymmetricAlgorithm 클래스(일반적으로 RSACryptoServiceProvider 또는 DSACryptoServiceProvider)에서 파생되는 클래스의 새 인스턴스를 만들고 이전에 만들어진 CspParameters 개체를 해당 생성자에 전달합니다.

  3. AsymmetricAlgorithm에서 파생되는 클래스의 RSACryptoServiceProvider.PersistKeyInCsp 또는 DSACryptoServiceProvider.PersistKeyInCsp 속성을 false(Visual Basic의 경우 False)로 설정합니다.

  4. 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.

참고 항목