SecureString 클래스

정의

더 이상 필요 없게 되면 컴퓨터 메모리에서 삭제되는 텍스트처럼 기밀을 유지해야 하는 텍스트를 나타냅니다. 이 클래스는 상속될 수 없습니다.

public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
    interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
상속
SecureString
구현

예제

다음 예제에서는 사용 하는 방법에 설명 합니다 SecureString 새 프로세스를 시작 하려면 자격 증명으로 사용할 사용자의 암호를 보호 합니다.

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Security;

public class Example
{
    public static void Main()
    {
        // Instantiate the secure string.
        SecureString securePwd = new SecureString();
        ConsoleKeyInfo key;

        Console.Write("Enter password: ");
        do {
           key = Console.ReadKey(true);
           
           // Ignore any key out of range.
           if (((int) key.Key) >= 65 && ((int) key.Key <= 90)) {
              // Append the character to the password.
              securePwd.AppendChar(key.KeyChar);
              Console.Write("*");
           }   
        // Exit if Enter key is pressed.
        } while (key.Key != ConsoleKey.Enter);
        Console.WriteLine();
        
        try {
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN");
        }
        catch (Win32Exception e) {
            Console.WriteLine(e.Message);
        }
        finally {
           securePwd.Dispose();
        }
    }
}
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Security

Public Class Example
    Public Shared Sub Main()
        ' Instantiate the secure string.
        Dim securePwd As New SecureString()
        Dim key As ConsoleKeyInfo
        
        Console.Write("Enter password: ")
        Do
           key = Console.ReadKey(True)

           ' Ignore any key out of range
           If CInt(key.Key) >= 65 And CInt(key.Key <= 90) Then    
              ' Append the character to the password.
              securePwd.AppendChar(key.KeyChar)
              Console.Write("*")
           End If                                    
        ' Exit if Enter key is pressed.
        Loop While key.Key <> ConsoleKey.Enter
        Console.WriteLine()
        
        Try
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN")
        Catch e As Win32Exception
            Console.WriteLine(e.Message)
        Finally
           securePwd.Dispose()
        End Try
    End Sub
End Class

설명

중요

새 개발에는 클래스를 사용하지 않는 것이 SecureString 좋습니다. 자세한 내용은 GitHub SecureString을 사용하면 안 되는지를 참조하세요.

SecureString 는 보안 측정값을 제공하는 문자열 형식입니다. 프로세스 메모리에 잠재적으로 중요한 문자열을 일반 텍스트로 저장하지 않도록 합니다. 그러나 제한은 SecureString이 얼마나 안전한가요? 섹션을 참조하세요. 인스턴스의 SecureString 값은 인스턴스가 초기화되거나 값이 수정될 때 기본 플랫폼에서 지원하는 메커니즘을 사용하여 자동으로 보호됩니다. 애플리케이션 인스턴스를 변경할 수 없는 렌더링을 호출 하 여 더 이상 수정할 수는 MakeReadOnly 메서드.

인스턴스의 최대 SecureString 길이는 65,536자입니다.

중요

이 형식이 구현 하는 IDisposable 인터페이스입니다. 형식의 인스턴스 사용을 마쳤으면 직접 또는 간접적으로 삭제해야 합니다. 직접 형식의 dispose 호출 해당 Dispose 의 메서드를 try/catch 블록입니다. 삭제 하지 직접, 언어 구문 같은 사용 using (C#에서) 또는 Using (Visual Basic에서는). 자세한 내용은 "를 사용 하는 개체는 구현 IDisposable" 섹션을 참조 하세요.를 IDisposable 인터페이스 항목입니다.

SecureString클래스와 해당 멤버는 COM에 표시되지 않습니다. 자세한 내용은 ComVisibleAttribute를 참조하세요.

이 섹션의 내용은 다음과 같습니다.

String 및 SecureString
SecureString 작업
SecureString 및 interop
SecureString은 얼마나 안전합니까?

String과 SecureString 비교

System.String클래스의 인스턴스는 변경할 수 없으며 더 이상 필요하지 않은 경우 가비지 수집을 위해 프로그래밍 방식으로 예약할 수 없습니다. 즉, 인스턴스가 만들어진 후 읽기 전용이며 컴퓨터 메모리에서 인스턴스가 삭제되는 시기를 예측할 수 없습니다. System.String인스턴스는 변경할 수 없으므로 기존 인스턴스를 수정하는 것처럼 보이는 작업은 실제로 조작할 복사본을 만듭니다. 따라서 경우는 String 암호, 신용 카드 번호 또는 개인 데이터와 같은 중요 한 정보를 포함 하는 개체, 애플리케이션 컴퓨터 메모리에서 데이터를 삭제할 수 없으므로 사용 후 정보 누설 될 위험이 있습니다 .

SecureString개체는 String 텍스트 값이 있다는 점에서 개체와 비슷합니다. 그러나 값을 SecureString 메모리에 고정 되어 개체, 애플리케이션 읽기 전용으로 표시 될 때까지 기본 운영 체제에서 제공 하는 암호화를 수정할 수와 같은 보호 메커니즘을 사용할 수 있고 컴퓨터 메모리에서 삭제할 수 있습니다 애플리케이션 호출 하 여는 Dispose 메서드 또는.NET Framework 가비지 수집기에 의해 합니다.

클래스의 제한에 대한 자세한 내용은 SecureString SecureString이 얼마나 안전한가요? 섹션을 참조하세요.

맨 위로 이동

SecureString 작업

SecureString클래스에는 다음을 수행할 수 있는 멤버가 포함됩니다.

개체 인스턴스화 SecureString
SecureString매개 변수가 없는 생성자를 호출하여 개체를 인스턴스화합니다.

개체에 문자 추가 SecureString
개체 SecureString 또는 메서드를 호출하여 개체에 한 번에 하나의 문자를 추가할 수 AppendChar InsertAt 있습니다.

중요

SecureString중요한 데이터에는 변경 불가능한 String 클래스의 메모리 지속성 결과가 이미 적용되므로 개체는 에서 생성되지 않아야 String 합니다. 생성 하는 가장 좋은 방법은 개체와 같은 한 SecureString 번에 문자 관리 되지 않는 소스에서는 Console.ReadKey 메서드.

개체에서 문자 제거 SecureString
메서드를 호출하여 개별 문자를 SetAt 바꾸거나, 메서드를 호출하여 개별 문자를 RemoveAt 제거하거나, 메서드를 호출하여 인스턴스에서 모든 문자를 제거할 수 SecureString Clear 있습니다.

SecureString개체를 읽기 전용으로 만들기
개체가 나타내는 문자열을 정의한 후에는 SecureString 해당 MakeReadOnly 메서드를 호출하여 문자열을 읽기 전용으로 만듭니다.

개체에 대한 정보 얻기 SecureString
SecureString클래스에는 문자열에 대한 정보를 제공하는 두 개의 멤버만 있습니다. 해당 Length 속성은 문자열에서 UTF16으로 인코딩된 코드 단위의 수를 IsReadOnly 나타내고 , 메서드는 인스턴스가 읽기 전용인지 여부를 나타냅니다.

인스턴스에 할당된 메모리 해제 SecureString
SecureString는 인터페이스를 구현하므로 IDisposable 메서드를 호출하여 메모리를 Dispose 해제합니다.

SecureString클래스에는 의 값을 검사, 비교 또는 변환하는 멤버가 SecureString 없습니다. 이러한 멤버가 없으면 인스턴스의 값을 실수로 노출하거나 악의적으로 노출하지 않도록 보호할 수 있습니다. 클래스의 적절한 System.Runtime.InteropServices.Marshal 멤버(예: SecureStringToBSTR 메서드)를 사용하여 개체의 값을 SecureString 조작합니다.

.NET Framework 클래스 라이브러리는 일반적으로 다음과 SecureString 같은 방법으로 인스턴스를 사용합니다.

맨 위로 이동

SecureString 및 interop

운영 체제에서 를 직접 지원하지 않으므로 문자열을 SecureString SecureString 네이티브 메서드에 전달하기 전에 개체의 값을 필수 문자열 형식으로 변환해야 합니다. Marshal클래스에는 이 작업을 수행하는 5개의 메서드가 있습니다.

이러한 각 메서드는 관리되지 않는 메모리에 지우기 텍스트 문자열을 만듭니다. 개발자는 더 이상 필요하지 않은 즉시 메모리를 0으로 만들고 확보해야 합니다. 각 문자열 변환 및 메모리 할당 메서드에는 할당된 메모리를 0으로 하고 여유하는 해당 메서드가 있습니다.

할당 및 변환 방법 0 및 free 메서드
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

맨 위로 이동

SecureString은 얼마나 안전합니까?

제대로 만들어지면 SecureString 인스턴스는 보다 더 많은 데이터 보호를 String 제공합니다. 한 번에 문자 소스에서 문자열을 만들 때 는 String 메모리에 여러 중간을 만드는 반면 는 SecureString 단일 인스턴스만 만듭니다. String개체의 가비지 수집은 비결정적입니다. 또한 메모리가 고정되지 않기 때문에 가비지 수집기는 String 메모리를 이동하고 압축할 때 값의 추가 복사본을 만듭니다. 반면에 개체에 할당된 SecureString 메모리는 고정되며 메서드를 호출하여 해당 메모리를 해제할 수 Dispose 있습니다.

인스턴스에 저장된 데이터가 SecureString 인스턴스에 저장된 데이터보다 더 안전하지만 String 인스턴스의 보안 정도에는 상당한 제한이 SecureString 있습니다. 여기에는 다음이 포함됩니다.

플랫폼
Windows 운영 체제에서는 SecureString 인스턴스의 내부 문자 배열 내용이 암호화됩니다. 그러나 누락된 API 또는 키 관리 문제로 인해 암호화는 모든 플랫폼에서 사용할 수 없습니다. 이 플랫폼 종속성으로 인해 SecureString은 Windows 플랫폼 이외의 내부 스토리지를 암호화하지 않습니다. 다른 기술은 추가 보호를 제공하기 위해 해당 플랫폼에서 사용됩니다.

기간
구현에서 암호화를 활용할 수 있더라도 SecureString 인스턴스에 할당된 일반 텍스트는 SecureString 다양한 시간에 노출될 수 있습니다.

  • Windows 운영 체제 수준에서 보안 문자열 구현을 제공하지 않으므로 .NET Framework 보안 문자열 값을 일반 텍스트 표현으로 변환하여 사용해야 합니다.

  • 보안 문자열의 값이 또는 와 같은 메서드에 의해 수정될 때마다 AppendChar RemoveAt 암호를 해독하고(즉, 일반 텍스트로 다시 변환) 수정한 다음 다시 암호화해야 합니다.

  • interop 호출에 보안 문자열을 사용하는 경우 ANSI 문자열, 유니코드 문자열 또는 BSTR(이진 문자열)로 변환해야 합니다. 자세한 내용은 SecureString 및 interop 섹션을 참조하세요.

SecureString인스턴스의 값이 노출되는 시간 간격은 클래스에 비해 String 단축됩니다.

스토리지 및 사용
보다 일반적으로 SecureString 클래스는 보호되거나 기밀로 유지되어야 하는 문자열 값에 대한 스토리지 메커니즘을 정의합니다. 그러나 .NET Framework 외부에서는 를 지원하는 사용 메커니즘이 SecureString 없습니다. 즉, 보안 문자열을 대상에서 인식할 수 있는 사용 가능한 형식(일반적으로 일반 텍스트 형식)으로 변환해야 하며 사용자 공간에서 암호 해독 및 변환이 발생해야 합니다.

전반적으로 SecureString 는 중요한 String 문자열 데이터의 노출을 제한하기 때문에 보다 안전합니다. 그러나 이러한 문자열은 호스트 컴퓨터에서 실행되는 악의적인 프로세스, 프로세스 덤프 또는 사용자가 볼 수 있는 스왑 파일과 같이 원시 메모리에 액세스할 수 있는 모든 프로세스 또는 작업에 계속 노출될 수 있습니다. 를 사용하여 암호를 보호하는 대신 SecureString 프로세스 외부에 저장된 자격 증명에 불투명 핸들을 사용하는 것이 좋습니다.

맨 위로 이동

생성자

SecureString()

SecureString 클래스의 새 인스턴스를 초기화합니다.

SecureString(Char*, Int32)

Char 개체의 하위 배열에서 SecureString 클래스의 새 인스턴스를 초기화합니다.

이 생성자는 CLS 규격이 아닙니다. CLS 규격 대체 항목은 SecureString()입니다.

속성

Length

현재 보안 문자열의 문자 수를 가져옵니다.

메서드

AppendChar(Char)

현재 보안 문자열의 끝에 문자를 추가합니다.

Clear()

현재 보안 문자열의 값을 삭제합니다.

Copy()

현재 보안 문자열의 복사본을 만듭니다.

Dispose()

현재 SecureString 개체에서 사용하는 모든 리소스를 해제합니다.

Equals(Object)

지정된 개체가 현재 개체와 같은지 확인합니다.

(다음에서 상속됨 Object)
GetHashCode()

기본 해시 함수로 작동합니다.

(다음에서 상속됨 Object)
GetType()

현재 인스턴스의 Type을 가져옵니다.

(다음에서 상속됨 Object)
InsertAt(Int32, Char)

이 보안 문자열의 지정한 인덱스 위치에 문자를 삽입합니다.

IsReadOnly()

이 보안 문자열이 읽기 전용으로 표시되었는지를 나타냅니다.

MakeReadOnly()

이 보안 문자열의 텍스트 값을 읽기 전용으로 만듭니다.

MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.

(다음에서 상속됨 Object)
RemoveAt(Int32)

이 보안 문자열에서 지정한 인덱스 위치의 문자를 제거합니다.

SetAt(Int32, Char)

지정한 인덱스 위치의 기존 문자를 다른 문자로 바꿉니다.

ToString()

현재 개체를 나타내는 문자열을 반환합니다.

(다음에서 상속됨 Object)

적용 대상

추가 정보