2017-05-10 6 views
1

XML을 사용하여 타사 웹 서비스와 통신 중입니다. 보안 스캐너가 몇 가지 CWE-216 결함을보고한다는 것을 제외하고는 모든 것이 정상적으로 작동합니다. XMLSerialization을 사용하는 일반 텍스트 암호

암호

는 실제로 다음과 같은 LoginDetails 클래스 내에서 메모리에 저장되어

[Serializable()] 
public class LoginDetails 
{ 
    public string Login { get; set; } 
    public string Password { get; set; } 
} 

타사는 일반 텍스트로 전송되는 암호가 필요합니다 (예제 위해 단순화 된). 그래서 불행하게도 나는 여기에서 문제의 선택의 여지가 없다. 내가하고 싶은 일은 필드가 안전하게 저장되고 /되거나 가능한 한 빨리 메모리에서 제거되도록하는 것입니다.

개선의 관점에서 나는 SecureString을 명백한 이유로 사용하려고 시도했으며 StringBuilder을 사용하면이 변경이 무효화됩니다. 또한 LoginDetails 클래스에 IDisposable을 구현하려고했습니다. 이것은 두 속성을 null로 설정하는 것으로 구성됩니다. 나는 여러 가지 토론 (particularly this one)으로 이어졌고 그다지 효과가 없다고 말했습니다.

필드 유형을 SecureString 또는 StringBuilder으로 변경할 때 문제가 발생합니다. 올바르게 직렬화되지 않아서 요청이 제 3 자에서 실패합니다. XMLSerializer을 다르게 처리하여이 유형을 다르게 처리 할 수있는 방법이 있습니까? 그렇기 때문에 우리 쪽 메모리에 다소 안전하게 저장되지만 일반 텍스트로 제 3 자에게 전송됩니다. 이러한 보안 시도는 양측에서 시행되지 않을 것인가?

내가 간과 한 것도 있을까요?

많은 감사

+0

같은 finally 블록 내에 배치 될 수있다? – NMGod

+0

내가 그 말을 바꿔 보겠습니다. 나는 그들이 그들의 유형에 따라 "올바르게"연재되고 있다고 가정하고있다. SecureString은 직렬화 가능 (이해할 수 없음) 인 반면 StringBuilder는 xx xx로 직렬화됩니다. 내가 필요한 것은 XMLSerializer를 사용할 때까지 안전성이 있거나 (지금 가지고있는 것보다 안전하다) 암호 속성의 cleartext 값이 제 3 자에게 전송되는 시점입니다. –

+0

Remembber StringBuilder가 비 상속 (Non-Inherit) 인 스크래치. – NMGod

답변

0

이 해결하기 위해 나는 IXmlSerializableIDisposable 모두를 구현 SerializableSecureString라는 이름의 사용자 정의 유형을 만들었습니다.

다음 사람이 앞으로 도움이되기를 바랍니다.

구현

유형은 전용 SecureString 멤버 변수를 포함하고, 직렬화하기 위해 사용되는 전용 string 속성. 다음과 같이 개인 문자열 속성에 대한 get

private readonly SecureString Content = new SecureString(); 
private string Value { } 

는 두 개의 생성자가 있습니다

get 
{ 
    IntPtr bstr = Marshal.SecureStringToBSTR(Content); 
    string copiedText = Marshal.PtrToStringAuto(bstr); 
    Marshal.ZeroFreeBSTR(bstr); 

    return copiedText; 
} 

... 전용 멤버 변수를 펼쳤다. 직렬화에 닷넷 전용으로 사용되는 비어있는 생성자 ...

public SerializableSecureString() 
{ 
} 

... 그리고 실제 유형의 유형을 위해. 그것은

public SerializableSecureString(string clearText) 
{ 
    if (clearText != null) 
    { 
     foreach (char t in clearText) 
      Content.AppendChar(t); 
    } 
} 

직렬화가 WriteXml 기능에 IXmlSerializable의 구현에서 발생 ... 일반 텍스트 문자열을 사용하고 있으므로 같은를 SecureString 변수로 그것을 패키지. WriteString을 사용하여 개인 문자열 속성 (값)의 값을 씁니다.

public void WriteXml(XmlWriter writer) 
{ 
    writer.WriteString(Value); 
} 

를 SecureString 값을 처리하기 위해, 나는 IDisposable 패턴 내에서 Dispose 방법을 구현라는 Content.Dispose()

에 인용 I합니다 (LoginDetails 클래스의 인스턴스를 만들 수 있습니다

사용 질문) ...

LoginDetails loginDetails = new LoginDetails 
{ 
    Login = "MyUsername", 
    Password = new SerializableSecureString(WebConfigurationManager.AppSettings["MyPassword"]) 
}; 

비밀번호는 web.config 파일의 암호화 된 섹션에 저장되므로 WebConfigurationManager을 사용하십시오.

는 사용 후, 데이터가 제대로 직렬화되지 않습니다에 의해 당신이 무엇을 의미합니까 다음

finally 
{ 
    LoginDetails.Password.Dispose(); 
}