문제

SecureString(캐시된 암호)을 C#(.Net 3.5)의 하위 프로세스에 전달할 수 있기를 원하지만 가장 안전한 방법이 무엇인지 모르겠습니다.예를 들어 SecureString을 다시 일반 문자열로 변환하여 명령줄 인수로 전달하려는 경우 생각하다 값은 디스크 페이징에 취약할 수 있습니다. 이로 인해 일반 텍스트가 파일 시스템에 닿게 되어 ​​SecureString 사용의 의미가 망가질 수 있습니다.

SecureString에 대한 IntPtr을 대신 전달할 수 있나요?위험을 증가시키지 않고 명명된 파이프를 사용할 수 있습니까?

도움이 되었습니까?

해결책

일반적으로 더 이국적인 공격을 걱정하기 전에 위협 모델을 정의해야 합니다.이 경우:누군가가 컴퓨터를 종료하고 하드 드라이브에 대한 법의학적 분석을 수행할까 봐 걱정되시나요?애플리케이션 메모리도 교체할 수 있으므로 간단한 사실은 하나 프로세스가 메모리에 이를 갖고 있으므로 잠재적으로 스왑 파일에서 끝날 가능성이 있습니다.최대 절전 모드는 어떻습니까?최대 절전 모드 동안 메모리의 전체 내용이 하드 디스크에 기록됩니다(SecureString 및 아마도 암호화 키 포함!).공격자가 시스템에 접근할 수 있다면 어떻게 될까요? 실행되는 동안 애플리케이션의 메모리를 검색할 수 있나요?

일반적으로 클라이언트 측 보안은 매우 까다로우며 전용 하드웨어(TPM 칩 등)가 없으면 올바른 보안을 유지하는 것이 거의 불가능합니다.두 가지 해결책은 다음과 같습니다.

  • 두 문자열 간의 동등성만 테스트해야 하는 경우(예:이 문자열이 이전에 가지고 있던 문자열과 동일합니까? (소금 처리된) 해시 값만 저장하세요.
  • 두 번째 필요할 때 사용자가 정보를 다시 입력하도록 합니다. (별로 편리하지는 않지만 보안과 편리성은 서로 반대됩니다.)

다른 팁

귀하의 하위 프로세스가 SecureString 작업 방법을 이해하지 않는 한 이를 직접 전달할 방법이 없다고 생각합니다.예를 들어, Process.Start() 메서드에는 SecureString을 사용하는 두 개의 오버로드가 있으므로 실제 문자열 값이 스니핑될 위험이 최소화됩니다(어딘가에서 실제 값을 검색/정렬 해제해야 하기 때문에 여전히 가능합니다).

이 작업을 수행하는 방법은 하위 프로세스가 무엇인지, 어떻게 시작되는지에 따라 달라질 것이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top