2017-09-05 3 views
0

저장 한 자격 증명을 사용할 수있는 특정 Windows 응용 프로그램을 자동화하기 위해 Windows 저장된 자격 증명 관리를위한 advapi32.dll에 대한 API 호출을 사용하여 작업하고 있습니다.COM에서의 관리되지 않는 유니 코드 문자열 SecureString에 대한 작업 할당 자 메모리

언제든지 암호에 포함 된 텍스트와 상호 작용할 필요가 없으므로 SecureString 암호를 사용하도록 코드를 업데이트하려고합니다. 따라서 응용 프로그램이 일반 텍스트로 암호를 보유하지 않으면 더 안전해야합니다. . 이 응용 프로그램에 다시 그 정보를 읽어 올 때

var unmanagedPassword = Marshal.SecureStringToCoTaskMemUnicode(userCredential.Password); 

그러나, 나는 방법을 찾을 수 없습니다 : 나는 API에 전달하는 COM 작업 할당 메모리에 SecureString을 마샬링 할 수 있어요

는 통화를 해당 관리되지 않는 문자열을 SecureString으로 마샬링하고 문자열을 관리되는 메모리로 복사하지 않고 문자열이나 바이트 배열로 가져옵니다.

내가 간과하는 안전한 방법이 있습니까?

+0

downvoter는이 질문이 원하는 결과없이 "왜 작동하지 않는"질문인지 설명해 주시겠습니까? 내가 할 수있는 방법을 찾을 수없는 일을하는 법을 묻습니다. 나는 내가 필요한 것을 분명히 지정했다고 생각한다. 관리되지 않는 메모리에서 새 SecureString을 만들려면 – Ashigore

+0

호기심의 감독입니다. 가장 간단한 방법은 (관리되지 않는 코드없이)'Marshal.ReadInt16()'에 대한 루프에서'.AppendChar()'를 호출하는 것입니다 (유니 코드 문자열이라고 가정). 'char *'와 길이를 취하는 안전하지 않은 생성자도있다. 관리되지 않는 메모리는 0으로 설정하고 할당을 해제해야합니다. 그렇지 않으면 모든 데이터가 일반 텍스트로 계속 떠있는 상태에서 'SecureString'을 사용하면 별 의미가 없습니다. –

+0

고마워요 @ JeroenMostert, 그 트릭을 했어! – Ashigore

답변

0

Jeroen Mostert에게 감사의 말을 전하며,이 솔루션으로 이어지는 그의 의견은 가능한 한 안전해야합니다.

Jeroen이 설명했듯이 각 문자는 short으로 읽히고 한 번에 하나씩 새 SecureString에 추가됩니다.

작업 할당 자 메모리의 관리되지 않는 문자열은 null로 종료되므로 0이 될 때까지 문자를 읽습니다. 관리되지 않는 이진 문자열은 접두사가 붙어 있으므로 아래 코드를 약간 수정해야합니다.

var outString = new SecureString(); 
    outString.AppendChar('p'); 
    outString.AppendChar('a'); 
    outString.AppendChar('s'); 
    outString.AppendChar('s'); 
    outString.AppendChar('w'); 
    outString.AppendChar('o'); 
    outString.AppendChar('r'); 
    outString.AppendChar('d'); 
    var ptr = Marshal.SecureStringToCoTaskMemUnicode(outString); 

    var inString = new SecureString(); 
    var i = 0; 
    short c; 

    while ((c = Marshal.ReadInt16(ptr, i)) != 0) 
    { 
     inString.AppendChar((char)c); 
     i += 2; 
    } 

    Marshal.ZeroFreeCoTaskMemUnicode(ptr); 
관련 문제