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?

SecureString 및 문자열String 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:

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

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

중요

중요 한 데이터에는 변경할 수 없는 String 클래스의 메모리 지 속성 결과가 이미 적용 되므로 String에서 SecureString 개체를 생성 하면 안 됩니다.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.

SecureString 개체에서 문자를 제거 합니다.Remove characters from a SecureString object
SetAt 메서드를 호출 하 여 개별 문자를 바꾸거나, RemoveAt 메서드를 호출 하 여 개별 문자를 제거 하거나, Clear 메서드를 호출 하 여 SecureString 인스턴스에서 모든 문자를 제거할 수 있습니다.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.

SecureString 개체에 대 한 정보 가져오기Get 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.

SecureString 인스턴스에 할당 된 메모리를 해제 합니다.Release the memory allocated to the SecureString instance
SecureStringIDisposable 인터페이스를 구현 하므로 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. SecureStringToBSTR 메서드와 같이 System.Runtime.InteropServices.Marshal 클래스의 적절 한 멤버를 사용 하 여 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. 것을 비우고 해당 메모리를 확보 하 여 더 이상 필요 없는 즉시 개발자의 책임입니다.It is the responsibility of the developer to zero out and free that memory as soon as it is no longer needed. 각 문자열 변환과 메모리 할당 메서드에 해당 하는 메서드를 비우고 할당된 된 메모리: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 0과 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.

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

전반적인 SecureString 중요 한 문자열 데이터의 노출을 제한 하기 때문에 String 보다 더 안전 합니다.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)

SecureString 개체의 하위 배열에서 Char 클래스의 새 인스턴스를 초기화합니다.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()

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

(다음에서 상속됨 Object)

적용 대상

추가 정보