Есть ли в C++ безопасная для хранения паролей строка?

С точки зрения безопасности после того, как пароль перестаёт использоваться программой, его стоит занулять.

То есть хотелось бы иметь какую-нибудь безопасную строку вместо std::string, которая при уничтожении или при присваивании ей нового значения зануляла бы область памяти, в которой хранится старая c-style строка.

Реализовать такую строку самостоятельно - не проблема, но всё-таки на реализацию всех широких возможностей std::string, которые хотелось бы иметь, уйдёт немало времени.

Есть ли уже готовые варианты для такого?


Ответы (1 шт):

Автор решения: AvidCoder

Я нашел решение в этом ответе на Stack Overflow (англ).

CryptoPP::AllocatorWithCleanup - это специальный аллокатор, предоставленный библиотекой Crypto++. При деаллокации он зануляет выделенную память.
Деаллокация происходит при уничтожении строки или при переполнении её буфера, что приводит к созданию нового буфера большего размера, в то время как старый буфер освобождается (могут быть и другие сценарии).
Однако это может не сработать при использовании операций clear() или resize().

Мое решение, основанное на том ответе:

SecureString.h

#pragma once

#include <string>
#include <cryptopp/secblock.h>

template <typename CharType, typename TraitsType = std::char_traits<CharType>>
using BasicSecureString = std::basic_string<CharType, TraitsType, CryptoPP::AllocatorWithCleanup<CharType>>;

using SecureString = BasicSecureString<char>;

CMAkeLists.txt

target_link_libraries(${EXECUTABLE_NAME} cryptopp)

Как установить библиотеку на дистрибутивах, основанных на Ubuntu:

sudo apt install libcrypto++-dev
→ Ссылка