hereの回答に基づいて、メモリを確実にゼロにするアロケータを作成しました。
#include <string>
#include <windows.h>
namespace secure
{
template <class T> class allocator : public std::allocator<T>
{
public:
template<class U> struct rebind { typedef allocator<U> other; };
allocator() throw() {}
allocator(const allocator &) throw() {}
template <class U> allocator(const allocator<U>&) throw() {}
void deallocate(pointer p, size_type num)
{
SecureZeroMemory((void *)p, num);
std::allocator<T>::deallocate(p, num);
}
};
typedef std::basic_string<char, std::char_traits<char>, allocator<char> > string;
}
int main()
{
{
secure::string bar("bar");
secure::string longbar("baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar");
}
}
ただし、 のstd::string
実装方法によっては、アロケータが小さな値に対してさえ呼び出されない可能性があります。たとえば、私のコードでは、(Visual Studio で)deallocate
文字列に対して呼び出されることさえありません。bar
答えは、機密データを保存するために std::string を使用できないということです。もちろん、ユース ケースを処理する新しいクラスを作成するオプションもありますが、std::string
定義どおりに使用することに特に関心がありました。
助けてくれてありがとう!