我正在尝试将安全字符串转换为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;
}
}
答案 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 );