¿Cómo escribir una clase segura con contraseña?

Esta pregunta sigue una sugerencia hecha por @sharptooth en esta pregunta relacionada .

¿Se puede std::string para que se convierta en una contraseña segura?

Si no, ¿cuáles serían las pautas para escribir una clase de manejo de contraseñas (por lo tanto, una clase que tenga mucho cuidado con lo que escribe en la memoria y lo borre antes de la destrucción)?

Sí, primero defina un asignador personalizado:

 template  class SecureAllocator : public std::allocator { public: template struct rebind { typedef SecureAllocator other; }; SecureAllocator() throw() {} SecureAllocator(const SecureAllocator&) throw() {} template  SecureAllocator(const SecureAllocator&) throw() {} void deallocate(pointer p, size_type n) { std::fill_n((volatile char*)p, n*sizeof(T), 0); std::allocator::deallocate(p, n); } }; 

Este asignador cerra la memoria antes de desasignar. Ahora escribe typedef:

 typedef std::basic_string, SecureAllocator> SecureString; 

Sin embargo, hay un pequeño problema, std :: string puede usar una optimización de cadena pequeña y almacenar algunos datos dentro de sí misma, sin asignación dinámica. Por lo tanto, debe borrarlo explícitamente en la destrucción o asignar en el montón con nuestro asignador personalizado:

 int main(int, char**) { using boost::shared_ptr; using boost::allocate_shared; shared_ptr str = allocate_shared(SecureAllocator(), "aaa"); } 

Esto garantiza que todos los datos se pongan a cero antes de la desasignación, incluido el tamaño de la cadena, por ejemplo.