Временная копия существует в памяти после преобразования многобайтового символа в широкий

Я пытаюсь преобразовать безопасную строку символов в строку Unicode. Так как мне нужно обрабатывать защищенные данные, я постарался очистить память после ее использования.
Я пытался следовать API для преобразования Unicode.

  • MultiByteToWideChar()
  • A2W()
  • mbstowcs_s()

Преобразование в строку Unicode успешно работает с прежде всего API.
После вышеописанной операции я очистил всю защищенную память данных, включая значение Юникода o / p.
Но при выгрузке памяти после этого копия строки Unicode остается в памяти. Я гарантировал, что все мои переменные, обрабатывающие безопасные данные, очищены (с помощью SecureZeroMemory() API).
Я подозреваю, что это временная копия, используемая вышеупомянутыми API. Мне нужно значение Unicode и нужно защитить свои данные. Как я могу этого достичь?

Фрагмент кода приведен ниже.

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;
}
}

2

Решение

Учитывая, что это всего лишь (несколько) байт в ширину, 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

По вопросам рекламы [email protected]