多字节到宽字符转换后,临时副本存在于内存中

时间:2014-11-25 14:21:04

标签: c++ winapi unicode secure-coding

我正在尝试将安全字符串转换为unicode字符串。由于我需要处理安全数据,因此我确保在使用后清除内存。 我尝试按照API进行unicode转换。

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

转换为Unicode字符串与上述所有API一起成功运行。 我在上述操作后清除了所有安全数据存储器,包括o / p unicode值。 但是在此之后转储内存时,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 个答案:

答案 0 :(得分:0)

考虑到它只是(多)字节到宽,WCHAR lookup[256]可能是一个可行的解决方案。您可以使用传递给MultiByteToWideChar的虚拟字符串来初始化该表 - 这没有安全漏洞。缺点:这对于实际的多字节编码不起作用。

答案 1 :(得分:0)

我有一个解决方案,无需临时副本即可转换为宽字符。

CHAR* pszSecuredData;
// Holds the secured multibyte data in pszSecuredData.

WCHAR* ptcszSecureData = new wchar_t[unSecureDataLength + 1];
swprintf( ptcszSecureData, unSecureDataLength + 1, L"%S", pszSecuredData );