Sí, primero definir un asignador de costumbre:
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);
}
};
Este asignador ceros la memoria antes de desasignar. Ahora typedef:
typedef std::basic_string<char, std::char_traits<char>, SecureAllocator<char>> SecureString;
Sin embargo, hay un pequeño problema, std :: string puede utilizar la optimización de la cadena pequeña y almacenar algunos datos en el interior de sí mismo, sin la asignación dinámica. Por lo que debe explícitamente claro en la destrucción o la asignación en el montón con nuestro asignador personalizado:
int main(int, char**)
{
using boost::shared_ptr;
using boost::allocate_shared;
shared_ptr<SecureString> str = allocate_shared<SecureString>(SecureAllocator<SecureString>(), "aaa");
}
Esto garantiza que todos los datos se pone a cero antes de cancelación de asignación, incluyendo el tamaño de la cadena, por ejemplo.
1) use std: wstring, 2) presione 0x2022 en lugar de símbolos de contraseña: o) En serio, si teme que otro proceso olfatee algo de su memoria, agregue/elimine alguna máscara (xor?) – alxx
@alxx : ¿Cómo sería mejor usar 'std :: wstring' en lugar de' std :: string'? Me estoy perdiendo de algo ? – ereOn
0x2022 es el símbolo de viñeta. ¿Consíguelo? :) – alxx