Sì, prima definire un allocatore personalizzato:
template <class T> class SecureAllocator : public std::allocator<T>
{
public:
template<class U> struct rebind { typedef SecureAllocator<U> other; };
SecureAllocator() throw() {}
SecureAllocator(const SecureAllocator&) throw() {}
template <class U> SecureAllocator(const SecureAllocator<U>&) throw() {}
void deallocate(pointer p, size_type n)
{
std::fill_n((volatile char*)p, n*sizeof(T), 0);
std::allocator<T>::deallocate(p, n);
}
};
Questo allocatore di zeri memoria prima deallocando. Ora è Typedef:
typedef std::basic_string<char, std::char_traits<char>, SecureAllocator<char>> SecureString;
Tuttavia c'è un piccolo problema, std :: string può utilizzare l'ottimizzazione stringa piccola e memorizzare alcuni dati all'interno di sé, senza l'allocazione dinamica. Quindi si deve esplicitamente chiaro su distruzione o allocare sul mucchio con il nostro allocatore personalizzato:
int main(int, char**)
{
using boost::shared_ptr;
using boost::allocate_shared;
shared_ptr<SecureString> str = allocate_shared<SecureString>(SecureAllocator<SecureString>(), "aaa");
}
Questo garantisce che tutti i dati viene azzerato prima della deallocazione, compresa la dimensione della stringa, per esempio.
1) utilizzare std: wstring, 2) push 0x2022 invece di simboli di password: o) Seriamente, se si teme che altri processi annusino qualcosa dalla memoria, aggiungere/rimuovere qualche maschera (xor?) – alxx
@alxx : Come utilizzare 'std :: wstring' invece di' std :: string' essere più sicuro?! Mi sto perdendo qualcosa ? – ereOn
0x2022 è un simbolo di proiettile. Prendilo? :) – alxx