다음을 통해 공유


System.Security.SecureString 클래스

중요합니다

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

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

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

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

중요합니다

이 형식은 IDisposable 인터페이스를 구현합니다. 형식의 인스턴스 사용을 마쳤으면 직접 또는 간접적으로 삭제해야 합니다. 형식을 직접 삭제하려면 Disposetry/ 블록에서 해당 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 개체에 문자 추가 SecureString 또는 AppendChar 메서드를 호출하여 InsertAt 개체에 한 번에 하나의 문자만 추가할 수 있습니다.

중요합니다

SecureString 객체는 String로부터 절대로 생성되어서는 안 되며, 이는 민감한 데이터가 불변의 String 클래스의 메모리가 지속되는 결과에 이미 노출되었기 때문입니다. SecureString 객체를 생성하는 가장 좋은 방법은 Console.ReadKey 메서드와 같은 관리되지 않는 문자 하나씩 처리하는 원본에서 시작하는 것입니다.

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

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

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

인스턴스에 할당된 메모리를 SecureString 해제합니다. 인터페이스를 SecureString 구현하기 때문에 IDisposable 메서드를 호출하여 메모리를 해제합니다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을 사용하는 대신, 프로세스 외부에 저장된 자격 증명에 대한 불투명 핸들을 사용하는 것이 권장됩니다.