Я пытаюсь преобразовать безопасную строку символов в строку 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;
}
}
Учитывая, что это всего лишь (несколько) байт в ширину, WCHAR lookup[256]
может быть жизнеспособным решением. Вы можете инициировать эту таблицу, используя фиктивную строку, переданную MultiByteToWideChar
— это не утечка безопасности. Недостаток: это не работает для реальных многобайтовых кодировок.
Я получил решение преобразовать в широкий символ без временной копии.
CHAR* pszSecuredData;
// Holds the secured multibyte data in pszSecuredData.
WCHAR* ptcszSecureData = new wchar_t[unSecureDataLength + 1];
swprintf( ptcszSecureData, unSecureDataLength + 1, L"%S", pszSecuredData );