Как написать класс, защищенный паролем? - PullRequest
14 голосов
/ 24 сентября 2010

Этот вопрос следует предложению, сделанному @sharptooth в этот связанный вопрос .

Может ли std::string быть настроен так, чтобы он стал безопасным для пароля?

Если нет, каковы были бы рекомендации по написанию класса обработки паролей (то есть класса, который заботится о том, что он записывает в память и очищает его перед уничтожением)?

1 Ответ

20 голосов
/ 24 сентября 2010

Да, сначала определите пользовательский распределитель:

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

Этот распределитель обнуляет память перед освобождением.Теперь вы напечатаетеdef:

typedef std::basic_string<char, std::char_traits<char>, SecureAllocator<char>> SecureString;

Однако есть небольшая проблема, std :: string может использовать небольшую оптимизацию строки и хранить некоторые данные внутри себя, без динамического выделения.Поэтому вы должны явно очистить его при уничтожении или выделить в куче с помощью нашего пользовательского распределителя:

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

}

Это гарантирует, что все данные обнуляются до освобождения, включая размер строкиНапример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...