Come scrivere una lezione sicura per la password?

Questa domanda segue un suggerimento fatto da @sharptooth in questa domanda correlata .

Può std::string essere ottimizzato in modo che diventi sicuro per la password?

In caso contrario, quali sarebbero le linee guida per scrivere una class di gestione delle password (quindi una class che presta grande attenzione a ciò che scrive in memoria e la cancella prima della distruzione)?

Sì, per prima cosa definisci un allocatore personalizzato:

 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); } }; 

Questo allocatore azzera la memoria prima della deallocazione. Ora digitate:

 typedef std::basic_string, SecureAllocator> SecureString; 

Comunque c’è un piccolo problema, std :: string può usare l’ottimizzazione della piccola stringa e memorizzare alcuni dati dentro se stesso, senza allocazione dynamic. Quindi devi esplicitamente cancellarlo in caso di distruzione o allocarlo nell’heap con il nostro allocatore personalizzato:

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

Ciò garantisce che tutti i dati vengano azzerati prima della deallocazione, inclusa la dimensione della stringa, ad esempio.