보안 문자 문자열을 유니 코드 문자열로 변환하려고합니다. 보안 데이터를 처리해야하므로 사용 후 메모리를 정리해야합니다. API를 따라 유니 코드 변환을 시도했습니다. MultiByteToWideChar()
다중 바이트 - 와이드 문자 변환 후 임시 복사본이 메모리에 존재합니다.
A2W()
mbstowcs_s()
유니 코드 문자열에변환
- 는 모든 API 위의 성공적으로 일했다. 위의 작업 후에 o/p 유니 코드 값을 포함하여 보안 된 데이터 메모리를 모두 지웠습니다. 그러나이 후에 메모리를 덤프하는 동안 유니 코드 문자열의 복사본은 메모리에 남아 있습니다.
SecureZeroMemory
() API를 사용하여 보안 데이터를 처리하는 모든 변수가 지워지도록했습니다. 위의 API에서 임시 복사본으로 사용 된 것 같습니다. 유니 코드 값이 필요하며 데이터를 보호해야합니다. 어떻게하면 될까요?코드 스 니펫은 아래에서 공유됩니다.
CHAR* pszPassword = NULL; UINT unPlainTextLen = 0; // Decrypt the secure data if(DecryptSecureData(pszPassword, unPlainTextLen)) { WCHAR *ptcszPassword_o = new WCHAR[unPlainTextLen + 1]; ptcszPassword_o[ unPlainTextLen ] = 0; size_t unSizeConverted = 0; if(0 == mbstowcs_s(&unSizeConverted, ptcszPassword_o, unPlainTextLen + 1, reinterpret_cast<CHAR*>(pszPassword), unPlainTextLen)) { // Clear Decrypted o/p buffer SecureZeroMemory(pszPassword, unPlainTextLen); delete[] pszPassword; // Process unicode data ptcszPassword_o SecureZeroMemory(ptcszPassword_o, unPlainTextLen * 2); delete[] pszPassword; } }
변환 및 'SecureZeroMemory'에 대한 호출을 둘러싼 코드를 표시 할 수 있습니까? preferrably 그냥 그것을 SSCCE로 만들기 – sehe
보안을 유지하려면 동적으로 링크 된 함수에 전달하지 않도록주의해야합니다. 실제 보안을위한 최선의 방법은 ICU를 정적으로 연결하고 소스가 어딘가에 복사하는지 여부를 실제로 검사하는 것입니다. – PeterT
무언가가 던져서'new' 포인터를 지우지 않으면 예외 처리가 필요하다는 것을 명심하십시오. 메모리에 앉아있을 것입니다. –