Основываясь на ответе, данном здесь , я написал распределитель для безопасного обнуления памяти.
#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
, получается, чтоВозможно, что распределитель даже не вызывается для небольших значений.Например, в моем коде deallocate
даже не вызывается для строки bar
(в Visual Studio).
Таким образом, ответ заключается в том, что мы не можем использовать std :: string дляхранить конфиденциальные данные.Конечно, у нас есть возможность написать новый класс, который обрабатывает сценарий использования, но мне было особенно интересно использовать std::string
, как определено.
Спасибо всем за вашу помощь!