SecureString 클래스

정의

더 이상 필요 없게 되면 컴퓨터 메모리에서 삭제되는 텍스트처럼 기밀을 유지해야 하는 텍스트를 나타냅니다.Represents text that should be kept confidential, such as by deleting it from computer memory when no longer needed. 이 클래스는 상속될 수 없습니다.This class cannot be inherited.

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

예제

다음 예제에서는를 사용 하 여 SecureString 새 프로세스를 시작 하기 위한 자격 증명으로 사용 하기 위해 사용자 암호를 보호 하는 방법을 보여 줍니다.The following example demonstrates how to use a SecureString to secure a user's password for use as a credential to start a new process.

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 .We don't recommend that you use the SecureString class for new development. 자세한 내용은 GitHub에서 SecureString을 사용 하지 않아야 합니다 .를 참조 하세요.For more information, see SecureString shouldn't be used on GitHub.

SecureString 는 보안 측정값을 제공 하는 문자열 형식입니다.SecureString is a string type that provides a measure of security. 잠재적으로 중요 한 문자열을 프로세스 메모리에 일반 텍스트로 저장 하지 않도록 시도 합니다.It tries to avoid storing potentially sensitive strings in process memory as plain text. (제한 사항에 대 한 자세한 내용은 SecureString? 섹션을 참조 하세요.) 인스턴스의 값은 SecureString 인스턴스가 초기화 되거나 값이 수정 될 때 기본 플랫폼에서 지원 되는 메커니즘을 사용 하 여 자동으로 보호 됩니다.(For limitations, however, see the How secure is SecureString? section.) The value of an instance of SecureString is automatically protected using a mechanism supported by the underlying platform when the instance is initialized or when the value is modified. 애플리케이션 인스턴스를 변경할 수 없는 렌더링을 호출 하 여 더 이상 수정할 수는 MakeReadOnly 메서드.Your application can render the instance immutable and prevent further modification by invoking the MakeReadOnly method.

인스턴스의 최대 길이는 SecureString 65536 자입니다.The maximum length of a SecureString instance is 65,536 characters.

중요

이 형식이 구현 하는 IDisposable 인터페이스입니다.This type implements the IDisposable interface. 형식의 인스턴스 사용을 완료 한 후에는 직접 또는 간접적으로 삭제 해야 합니다.When you have finished using an instance of the type, you should dispose of it either directly or indirectly. 직접 형식의 dispose 호출 해당 Dispose 의 메서드를 try/catch 블록입니다.To dispose of the type directly, call its Dispose method in a try/catch block. 삭제 하지 직접, 언어 구문 같은 사용 using (C#에서) 또는 Using (Visual Basic에서는).To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). 자세한 내용은 "를 사용 하는 개체는 구현 IDisposable" 섹션을 참조 하세요.를 IDisposable 인터페이스 항목입니다.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

SecureString클래스와 해당 멤버는 COM에 표시 되지 않습니다.The SecureString class and its members are not visible to COM. 자세한 내용은 ComVisibleAttribute를 참조하세요.For more information, see ComVisibleAttribute.

이 섹션의 내용은 다음과 같습니다.In this section:

문자열과 SecureString 비교 String vs. SecureString
SecureString 작업 SecureString operations
SecureString 및 interop SecureString and interop
SecureString은 얼마나 안전 한가요?How secure is SecureString?

문자열 및 SecureStringString versus SecureString

클래스의 인스턴스는 System.String 모두 변경할 수 없으며, 더 이상 필요 하지 않은 경우에는 프로그래밍 방식으로 가비지 수집을 예약할 수 없습니다. 즉, 인스턴스를 만든 후에 읽기 전용으로 설정할 수 없으며, 인스턴스가 컴퓨터 메모리에서 삭제 되는 시기를 예측할 수 없습니다.An instance of the System.String class is both immutable and, when no longer needed, cannot be programmatically scheduled for garbage collection; that is, the instance is read-only after it is created, and it is not possible to predict when the instance will be deleted from computer memory. 인스턴스는 변경할 수 없기 때문에 System.String 기존 인스턴스를 수정 하는 것 처럼 보이는 작업은 실제로 해당 인스턴스를 조작 하기 위해 복사본을 만듭니다.Because System.String instances are immutable, operations that appear to modify an existing instance actually create a copy of it to manipulate. 따라서 경우는 String 암호, 신용 카드 번호 또는 개인 데이터와 같은 중요 한 정보를 포함 하는 개체, 애플리케이션 컴퓨터 메모리에서 데이터를 삭제할 수 없으므로 사용 후 정보 누설 될 위험이 있습니다 .Consequently, if a String object contains sensitive information such as a password, credit card number, or personal data, there is a risk the information could be revealed after it is used because your application cannot delete the data from computer memory.

SecureString개체는 String 텍스트 값이 있다는 점에서 개체와 유사 합니다.A SecureString object is similar to a String object in that it has a text value. 그러나 값을 SecureString 메모리에 고정 되어 개체, 애플리케이션 읽기 전용으로 표시 될 때까지 기본 운영 체제에서 제공 하는 암호화를 수정할 수와 같은 보호 메커니즘을 사용할 수 있고 컴퓨터 메모리에서 삭제할 수 있습니다 애플리케이션 호출 하 여는 Dispose 메서드 또는.NET Framework 가비지 수집기에 의해 합니다.However, the value of a SecureString object is pinned in memory, may use a protection mechanism, such as encryption, provided by the underlying operating system, can be modified until your application marks it as read-only, and can be deleted from computer memory either by your application calling the Dispose method or by the .NET Framework garbage collector.

클래스의 제한 사항에 대 한 자세한 SecureString 내용은 SecureString is secure is? 섹션을 참조 하세요.For a discussion of the limitations of the SecureString class, see the How secure is SecureString? section.

맨 위로 이동Back to top

SecureString 작업SecureString operations

클래스에는 SecureString 다음 작업을 수행할 수 있는 멤버가 포함 되어 있습니다.The SecureString class includes members that allow you to do the following:

개체 인스턴스화 SecureStringInstantiate a SecureString object
SecureString매개 변수가 없는 생성자를 호출 하 여 개체를 인스턴스화합니다.You instantiate a SecureString object by calling its parameterless constructor.

개체에 문자 추가 SecureStringAdd characters to a SecureString object
SecureString또는 메서드를 호출 하 여 한 번에 하나의 문자를 개체에 추가할 수 있습니다 AppendChar InsertAt .You can add a single character at a time to a SecureString object by calling its AppendChar or InsertAt method.

중요

중요 한 데이터에는 SecureString 변경할 수 없는 String 클래스의 메모리 지 속성 결과가 이미 있으므로에서 개체를 생성 하면 안 됩니다 String .A SecureString object should never be constructed from a String, because the sensitive data is already subject to the memory persistence consequences of the immutable String class. 개체를 생성 하는 가장 좋은 방법은 SecureString 메서드와 같은 관리 되지 않는 문자의 시간에 대 한 소스에서 가져온 것입니다 Console.ReadKey .The best way to construct a SecureString object is from a character-at-a-time unmanaged source, such as the Console.ReadKey method.

개체에서 문자 제거 SecureStringRemove characters from a SecureString object
메서드를 호출 하 여 개별 문자를 바꾸거나 SetAt , 메서드를 호출 하 여 개별 문자를 제거 RemoveAt 하거나, SecureString 메서드를 호출 하 여 인스턴스에서 모든 문자를 제거할 Clear 수 있습니다.You can replace an individual character by calling the SetAt method, remove an individual character by calling the RemoveAt method, or remove all characters from the SecureString instance by calling the Clear method.

개체를 SecureString 읽기 전용으로 설정Make the SecureString object read-only
개체가 나타내는 문자열을 정의한 후에는 SecureString 해당 MakeReadOnly 메서드를 호출 하 여 문자열을 읽기 전용으로 설정 합니다.Once you have defined the string that the SecureString object represents, you call its MakeReadOnly method to make the string read-only.

개체에 대 한 정보 가져오기 SecureStringGet information about the SecureString object
SecureString이 클래스에는 문자열에 대 한 정보를 제공 하는 두 개의 멤버만 있습니다. 해당 Length 속성은 문자열의 UTF16 인코딩된 코드 단위 수를 나타내고 IsReadOnly , 메서드는 인스턴스가 읽기 전용인 지 여부를 나타냅니다.The SecureString class has only two members that provide information about the string: its Length property, which indicates the number of UTF16-encoded code units in the string; and the IsReadOnly, method, which indicates whether the instance is read-only.

인스턴스에 할당 된 메모리를 해제 합니다. SecureStringRelease the memory allocated to the SecureString instance
SecureString는 인터페이스를 구현 하므로 IDisposable 메서드를 호출 하 여 메모리를 해제 Dispose 합니다.Because SecureString implements the IDisposable interface, you release its memory by calling the Dispose method.

SecureString클래스에는의 값을 검사, 비교 또는 변환 하는 멤버가 없습니다 SecureString .The SecureString class has no members that inspect, compare, or convert the value of a SecureString. 이러한 멤버가 없으면 인스턴스의 값을 실수로 또는 악의적으로 노출 하지 않도록 보호 하는 데 도움이 됩니다.The absence of such members helps protect the value of the instance from accidental or malicious exposure. 메서드와 같은 클래스의 적절 한 멤버를 사용 System.Runtime.InteropServices.Marshal SecureStringToBSTR 하 여 개체의 값을 조작 SecureString 합니다.Use appropriate members of the System.Runtime.InteropServices.Marshal class, such as the SecureStringToBSTR method, to manipulate the value of a SecureString object.

.NET Framework 클래스 라이브러리는 일반적으로 다음과 같은 방법으로 인스턴스를 사용 합니다 SecureString .The .NET Framework Class Library commonly uses SecureString instances in the following ways:

맨 위로 이동Back to top

SecureString 및 interopSecureString and interop

운영 체제에서 직접을 지원 하지 않기 때문에 SecureString SecureString 문자열을 네이티브 메서드에 전달 하기 전에 개체의 값을 필요한 문자열 형식으로 변환 해야 합니다.Because the operating system does not directly support SecureString, you must convert the value of the SecureString object to the required string type before passing the string to a native method. Marshal클래스에는이 작업을 수행 하는 5 개의 메서드가 있습니다.The Marshal class has five methods that do this:

이러한 각 메서드는 관리 되지 않는 메모리에 일반 텍스트 문자열을 만듭니다.Each of these methods creates a clear-text string in unmanaged memory. 개발자는이를 0 아웃 하 고 더 이상 필요 하지 않게 되는 즉시 해당 메모리를 해제 해야 합니다.It is the responsibility of the developer to zero out and free that memory as soon as it is no longer needed. 각 문자열 변환 및 메모리 할당 메서드에는 0을 해제 하 고 할당 된 메모리를 해제 하는 해당 메서드가 있습니다.Each of the string conversion and memory allocation methods has a corresponding method to zero out and free the allocated memory:

할당 및 변환 방법Allocation and conversion method Zero 및 free 메서드Zero and free method
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeGlobalAllocUnicode

맨 위로 이동Back to top

SecureString은 얼마나 안전 한가요?How secure is SecureString?

올바르게 생성 SecureString 된 인스턴스는 보다 더 많은 데이터 보호 기능을 제공 String 합니다.When created properly, a SecureString instance provides more data protection than a String. 실시간 소스에서 문자열을 만들 때는 String 메모리에 여러 중간을 만들지만는 SecureString 단일 인스턴스만 만듭니다.When creating a string from a character-at-a-time source, String creates multiple intermediate in memory, whereas SecureString creates just a single instance. 개체의 가비지 컬렉션 String 은 비결 정적입니다.Garbage collection of String objects is non-deterministic. 또한 메모리는 고정 되지 않으므로 String 메모리를 이동 및 압축할 때 가비지 수집기가 값의 추가 복사본을 만듭니다.In addition, because its memory is not pinned, the garbage collector will make additional copies of String values when moving and compacting memory. 반면, 개체에 할당 된 메모리는 SecureString 고정 되 고 메서드를 호출 하 여 메모리를 해제할 수 있습니다 Dispose .In contrast, the memory allocated to a SecureString object is pinned, and that memory can be freed by calling the Dispose method.

인스턴스에 저장 된 데이터 SecureString 는 인스턴스에 저장 된 데이터 보다 더 안전 하지만 String 인스턴스의 보안 설정에 대 한 중요 한 제한 사항이 있습니다 SecureString .Although data stored in a SecureString instance is more secure than data stored in a String instance, there are significant limitations on how secure a SecureString instance is. 여기에는 다음이 포함됩니다.These include:

플랫폼Platform
Windows 운영 체제에서 SecureString 인스턴스의 내부 문자 배열의 내용이 암호화 됩니다.On the Windows operating system, the contents of a SecureString instance's internal character array are encrypted. 그러나 누락 된 Api 또는 키 관리 문제로 인해 모든 플랫폼에서 암호화를 사용할 수 있는 것은 아닙니다.However, whether because of missing APIs or key management issues, encryption is not available on all platforms. 이 플랫폼 종속성으로 인해 SecureString은 Windows 플랫폼 이외의 내부 스토리지를 암호화하지 않습니다.Because of this platform dependency, SecureString does not encrypt the internal storage on non-Windows platform. 기타 기술은 이러한 플랫폼에서 추가 보호를 제공 하는 데 사용 됩니다.Other techniques are used on those platforms to provide additional protection.

기간Duration
구현에서 암호화를 활용할 수 있는 경우에도 SecureString 인스턴스에 할당 된 일반 텍스트는 SecureString 다양 한 시간에 노출 될 수 있습니다.Even if the SecureString implementation is able to take advantage of encryption, the plain text assigned to the SecureString instance may be exposed at various times:

  • Windows는 운영 체제 .NET Framework 수준에서 보안 문자열 구현을 제공 하지 않기 때문에이를 사용 하기 위해 보안 문자열 값을 일반 텍스트 표현으로 변환 해야 합니다.Because Windows doesn't offer a secure string implementation at the operating system level, the .NET Framework still has to convert the secure string value to its plain text representation in order to use it.

  • 보안 문자열의 값을 또는와 같은 메서드에서 수정할 때마다 암호를 AppendChar RemoveAt 해독 하 고, 수정 하 고, 다시 암호화 해야 합니다.Whenever the value of the secure string is modified by methods such as AppendChar or RemoveAt, it must be decrypted (that is, converted back to plain text), modified, and then encrypted again.

  • Interop 호출에 보안 문자열을 사용 하는 경우 ANSI 문자열, 유니코드 문자열 또는 이진 문자열 (BSTR)로 변환 해야 합니다.If the secure string is used in an interop call, it must be converted to an ANSI string, a Unicode string, or a binary string (BSTR). 자세한 내용은 SecureString 및 interop 섹션을 참조 하세요.For more information, see the SecureString and interop section.

SecureString인스턴스의 값이 노출 되는 시간 간격은 클래스와 비교 하는 경우에만 줄어듭니다 String .The time interval for which the SecureString instance's value is exposed is merely shortened in comparison to the String class.

스토리지 및 사용Storage versus usage
보다 일반적으로 SecureString 클래스는 보호되거나 기밀로 유지되어야 하는 문자열 값에 대한 스토리지 메커니즘을 정의합니다.More generally, the SecureString class defines a storage mechanism for string values that should be protected or kept confidential. 그러나 .NET Framework 자체 외부에서는를 지 원하는 사용 메커니즘이 없습니다 SecureString .However, outside of the .NET Framework itself, no usage mechanism supports SecureString. 즉, 보안 문자열은 해당 대상에서 인식할 수 있는 사용할 수 있는 양식 (일반적으로 일반 텍스트 양식)으로 변환 되 고, 암호 해독 및 변환은 사용자 공간에서 발생 해야 합니다.This means that the secure string must be converted to a usable form (typically a clear text form) that can be recognized by its target, and that decryption and conversion must occur in user space.

전반적인 SecureStringString 중요 한 문자열 데이터의 노출을 제한 하기 때문에 보다 안전 합니다.Overall, SecureString is more secure than String because it limits the exposure of sensitive string data. 그러나 해당 문자열은 호스트 컴퓨터에서 실행 되는 악의적인 프로세스, 프로세스 덤프 또는 사용자가 볼 수 있는 스왑 파일 처럼 원시 메모리에 대 한 액세스 권한이 있는 프로세스나 작업에 계속 노출 될 수 있습니다.However, those strings may still be exposed to any process or operation that has access to raw memory, such as a malicious process running on the host computer, a process dump, or a user-viewable swap file. 를 사용 하 여 암호를 보호 하는 대신 SecureString 프로세스 외부에 저장 된 자격 증명에 불투명 핸들을 사용 하는 것이 좋습니다.Instead of using SecureString to protect passwords, the recommended alternative is to use an opaque handle to credentials that are stored outside of the process.

맨 위로 이동Back to top

생성자

SecureString()

SecureString 클래스의 새 인스턴스를 초기화합니다.Initializes a new instance of the SecureString class.

SecureString(Char*, Int32)

Char 개체의 하위 배열에서 SecureString 클래스의 새 인스턴스를 초기화합니다.Initializes a new instance of the SecureString class from a subarray of Char objects.

이 생성자는 CLS 규격이 아닙니다.This constructor is not CLS-compliant. CLS 규격 대체 항목은 SecureString()입니다.The CLS-compliant alternative is SecureString().

속성

Length

현재 보안 문자열의 문자 수를 가져옵니다.Gets the number of characters in the current secure string.

메서드

AppendChar(Char)

현재 보안 문자열의 끝에 문자를 추가합니다.Appends a character to the end of the current secure string.

Clear()

현재 보안 문자열의 값을 삭제합니다.Deletes the value of the current secure string.

Copy()

현재 보안 문자열의 복사본을 만듭니다.Creates a copy of the current secure string.

Dispose()

현재 SecureString 개체에서 사용하는 모든 리소스를 해제합니다.Releases all resources used by the current SecureString object.

Equals(Object)

지정된 개체가 현재 개체와 같은지 확인합니다.Determines whether the specified object is equal to the current object.

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

기본 해시 함수로 작동합니다.Serves as the default hash function.

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

현재 인스턴스의 Type을 가져옵니다.Gets the Type of the current instance.

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

이 보안 문자열의 지정한 인덱스 위치에 문자를 삽입합니다.Inserts a character in this secure string at the specified index position.

IsReadOnly()

이 보안 문자열이 읽기 전용으로 표시되었는지를 나타냅니다.Indicates whether this secure string is marked read-only.

MakeReadOnly()

이 보안 문자열의 텍스트 값을 읽기 전용으로 만듭니다.Makes the text value of this secure string read-only.

MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다.Creates a shallow copy of the current Object.

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

이 보안 문자열에서 지정한 인덱스 위치의 문자를 제거합니다.Removes the character at the specified index position from this secure string.

SetAt(Int32, Char)

지정한 인덱스 위치의 기존 문자를 다른 문자로 바꿉니다.Replaces the existing character at the specified index position with another character.

ToString()

현재 개체를 나타내는 문자열을 반환합니다.Returns a string that represents the current object.

(다음에서 상속됨 Object)

적용 대상

추가 정보