2014-11-25 1 views
2

보안 문자 문자열을 유니 코드 문자열로 변환하려고합니다. 보안 데이터를 처리해야하므로 사용 후 메모리를 정리해야합니다. 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; 
          }    
      } 
      
    +0

    변환 및 'SecureZeroMemory'에 대한 호출을 둘러싼 코드를 표시 할 수 있습니까? preferrably 그냥 그것을 SSCCE로 만들기 – sehe

    +0

    보안을 유지하려면 동적으로 링크 된 함수에 전달하지 않도록주의해야합니다. 실제 보안을위한 최선의 방법은 ICU를 정적으로 연결하고 소스가 어딘가에 복사하는지 여부를 실제로 검사하는 것입니다. – PeterT

    +0

    무언가가 던져서'new' 포인터를 지우지 않으면 예외 처리가 필요하다는 것을 명심하십시오. 메모리에 앉아있을 것입니다. –

    답변

    0

    이 넓은 단지 (멀티) 바이트이다하는 WCHAR lookup[256]이 가능한 솔루션 고려 될 수있다. MultiByteToWideChar에 전달 된 더미 문자열을 사용하여 해당 테이블을 초기화 할 수 있습니다. 이는 보안 누출이 아닙니다. 단점 : 실제 멀티 바이트 인코딩에는 작동하지 않습니다.

    0

    임시 사본없이 넓은 문자로 변환하는 해결책이 있습니다.

    CHAR* pszSecuredData; 
    // Holds the secured multibyte data in pszSecuredData. 
    
    WCHAR* ptcszSecureData = new wchar_t[unSecureDataLength + 1]; 
    swprintf(ptcszSecureData, unSecureDataLength + 1, L"%S", pszSecuredData); 
    
    +0

    이 버전은 UTF-8 또는 다른 인코딩을 번역하지 않습니다.이 인코딩은'MultiByteToWideChar' 또는'mbstowcs'의 전체 요점입니다. –

    관련 문제