SecureString SecureString SecureString SecureString Class

정의

더 이상 필요 없게 되면 컴퓨터 메모리에서 삭제되는 텍스트처럼 기밀을 유지해야 하는 텍스트를 나타냅니다. 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
상속
SecureStringSecureStringSecureStringSecureString
구현

예제

다음 예제에 사용 하는 방법을 보여 줍니다.는 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 보안 조치를 제공 하는 문자열 형식이입니다.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 인스턴스가 65,536 개의 문자입니다.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:

Vs는 문자열입니다. 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은 얼마나 안전? 섹션입니다.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
한 번에 단일 문자를 추가할 수 있습니다는 SecureString 개체를 호출 하 여 해당 AppendChar 또는 InsertAt 메서드.You can add a single character at a time to a SecureString object by calling its AppendChar or InsertAt method.

중요

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

문자를 제거는 SecureString 개체Remove 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.

에 대 한 정보를 가져오기는 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
때문에 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. 것을 비우고 해당 메모리를 확보 하 여 더 이상 필요 없는 즉시 개발자의 책임입니다.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.

기간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 (i.e., 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() SecureString() SecureString()

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

SecureString(Char*, Int32) SecureString(Char*, Int32) SecureString(Char*, Int32) 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 Length Length Length

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

메서드

AppendChar(Char) AppendChar(Char) AppendChar(Char) AppendChar(Char)

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

Clear() Clear() Clear() Clear()

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

Copy() Copy() Copy() Copy()

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

Dispose() Dispose() Dispose() Dispose()

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

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

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

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

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

(Inherited from Object)
GetType() GetType() GetType() GetType()

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

(Inherited from Object)
InsertAt(Int32, Char) InsertAt(Int32, Char) InsertAt(Int32, Char) InsertAt(Int32, Char)

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

IsReadOnly() IsReadOnly() IsReadOnly() IsReadOnly()

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

MakeReadOnly() MakeReadOnly() MakeReadOnly() MakeReadOnly()

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

MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

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

(Inherited from Object)
RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32)

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

SetAt(Int32, Char) SetAt(Int32, Char) SetAt(Int32, Char) SetAt(Int32, Char)

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

ToString() ToString() ToString() ToString()

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

(Inherited from Object)

적용 대상

추가 정보