여기에 내 가정이 틀렸다면 언제든지 바로 고치십시오. 그러나 내가 왜 묻는 지 설명하겠습니다.
MSDN에서 가져온 SecureString
:
기밀로 유지해야하는 텍스트를 나타냅니다. 텍스트는 사용시 개인 정보 보호를 위해 암호화되며 더 이상 필요하지 않은 경우 컴퓨터 메모리에서 삭제됩니다.
나는 이것을 얻습니다. 암호 또는 다른 개인 정보를 a SecureString
이상 에 저장하는 것이 합리적입니다 System.String
. 왜냐하면 실제로 메모리에 저장되는 방법과시기를 제어 할 수 있기 때문입니다 System.String
.
불변이며 더 이상 필요하지 않은 경우 프로그래밍 방식으로 가비지 수집을 예약 할 수 없습니다. 즉, 인스턴스는 작성된 후 읽기 전용이며 인스턴스가 컴퓨터 메모리에서 삭제 될시기를 예측할 수 없습니다. 따라서 String 개체에 암호, 신용 카드 번호 또는 개인 데이터와 같은 중요한 정보가 포함 된 경우, 응용 프로그램이 컴퓨터 메모리에서 데이터를 삭제할 수 없으므로 사용 후 정보가 노출 될 위험이 있습니다.
그러나 GUI 응용 프로그램 (예 : ssh 클라이언트)의 경우 SecureString
는에서 빌드해야합니다 System.String
. 모든 텍스트 컨트롤 은 기본 데이터 형식으로 문자열을 사용합니다 .
따라서 사용자가 키를 누를 때마다 기존의 문자열이 삭제되고 암호 마스크를 사용하더라도 텍스트 상자 내부의 값을 나타내는 새 문자열이 작성됩니다. 그리고 우리는 그러한 값이 언제 메모리에서 버려지는지 제어 할 수 없습니다 .
이제 서버에 로그인 할 차례입니다. 뭔지 맞춰봐? 인증을 위해 연결을 통해 문자열을 전달해야합니다 . 이제 우리 SecureString
를 System.String
... 로 변환합시다 . 이제 우리는 힙에 가비지 수집을 거치지 않고 (또는 버퍼에 0을 쓰도록) 문자열을 가지고 있습니다.
내 요점은 : 당신이 상관없이, 선을 따라 어딘가에 SecureString
되어 가고는 로 변환 할 System.String
그것을 의미, 어떤 점에서 힙에 이상 존재에서 (가비지 컬렉션의 보증없이) 것입니다.
내 요점은 : ssh 연결에 문자열을 보내는 것을 우회하는 방법이 있는지 또는 컨트롤에 문자열을 저장하는 것을 우회하는 방법이 있는지 여부입니다 (사용자 정의 컨트롤 만들기). 이 질문에 대해 "ssh 연결"을 "로그인 양식", "등록 양식", "지급 양식", "음식-당신은-먹이-당신의 강아지-하지만 당신의 자녀가 아닌 양식", 기타
- 그렇다면 어느 시점에서
SecureString
실제로 사용하는 것이 실용적이됩니까? System.String
객체 의 사용을 완전히 근절하는 데 추가 개발 시간이 가치가 있습니까?- 힙에
SecureString
걸리는 시간을 단순히 줄이는 것이 핵심System.String
입니까 (실제 스왑 파일로 이동할 위험을 줄입니까)? - 공격자는 이미 힙 검사하기위한 수단을 가지고 있다면 그 가능성 중 하나 (A)는 이미 이미 키 입력, 또는 (B)를 읽을 수있는 수단이 물리적으로 기계했다 ... 그래서 사용 것이
SecureString
받는 점점에서 그를 방지를 어쨌든 데이터? - 이것은 단지 "불분명을 통한 보안"입니까?
질문을 너무 두껍게하면 호기심이 더 좋아졌습니다. 내 질문의 일부 또는 전부에 자유롭게 대답하십시오 (또는 내 가정이 완전히 잘못되었다고 말하십시오). :)
SecureString
정말 보안 문자열이 아닙니다. 누군가가 메모리를 검사하고 중요한 데이터를 성공적으로 얻을 수있는 시간을 줄이는 방법 일뿐입니다. 이것은 방탄이 아니며 의도 된 것이 아닙니다. 그러나 당신이 올리는 포인트는 매우 유효합니다. 관련 : stackoverflow.com/questions/14449579/…