System.Security.SecureString 클래스

Important

.NET(Core)에서 새 개발을 위해 또는 기존 코드를 .NET(Core)으로 마이그레이션할 때는 클래스를 사용하지 SecureString 않는 것이 좋습니다. 자세한 내용은 SecureString을 사용하면 안 됨을 참조하세요.

이 문서에서는 이 API에 대한 참조 설명서에 대한 추가 설명서를 제공합니다.

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

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

Important

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

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

문자열과 SecureString 비교

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

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

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

SecureString 작업

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

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

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

Important

SecureString 중요한 데이터는 변경할 수 String없는 String 클래스의 메모리 지속성 결과에 이미 적용되므로 개체를 생성해서는 안 됩니다. 개체를 생성하는 SecureString 가장 좋은 방법은 메서드와 같은 관리되지 않는 한 번에 문자 원본을 사용하는 Console.ReadKey 것입니다.

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

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

개체에 대한 SecureString 정보 가져오기 클래스에는 문자열에 대한 정보를 제공하는 멤버가 두 개뿐입니다. 문자열의 UTF16 인코딩 코드 단위 수를 나타내는 속성 LengthIsReadOnly인스턴스가 읽기 전용인지 여부를 나타내는 메서드 SecureString 입니다.

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

클래스에는 SecureString 값을 검사, 비교 또는 변환하는 멤버가 SecureString없습니다. 이러한 멤버가 없으면 우발적이거나 악의적인 노출로부터 인스턴스의 값을 보호할 수 있습니다. 메서드와 같은 클래스의 System.Runtime.InteropServices.Marshal 적절한 멤버를 SecureStringToBSTR 사용하여 개체의 SecureString 값을 조작합니다.

.NET 클래스 라이브러리는 일반적으로 다음과 같은 방법으로 인스턴스를 사용합니다 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에서는 보안 문자열 값을 일반 텍스트 표현으로 변환해야 합니다.

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

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

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

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

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