2

安全な文字列をユニコード文字列に変換しようとしています。安全なデータを処理する必要があるため、使用後にメモリをクリアする必要があります。API を unicode に変換してみました。

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

Unicode 文字列への変換は、上記のすべての API で正常に機能しました。上記の操作の後、o/p Unicode 値を含め、保護されたすべてのデータ メモリをクリアしました。しかし、この後にメモリをダンプしている間、Unicode 文字列のコピーがメモリに残ります。安全なデータを処理するすべての変数が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;
    }              
}
4

2 に答える 2

0

一時コピーなしでワイド文字に変換する解決策を得ました。

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

WCHAR* ptcszSecureData = new wchar_t[unSecureDataLength + 1];
swprintf( ptcszSecureData, unSecureDataLength + 1, L"%S", pszSecuredData );
于 2014-11-27T04:22:48.257 に答える
0

それが単なる(マルチ)バイトからワイドであるWCHAR lookup[256]ことを考えると、実行可能なソリューションかもしれません。渡されたダミー文字列を使用してそのテーブルを初期化できますMultiByteToWideChar-これはセキュリティリークではありません。欠点: これは、実際のマルチバイト エンコーディングでは機能しません。

于 2014-11-25T14:43:36.260 に答える