Есть ли в C++ безопасная для хранения паролей строка?
С точки зрения безопасности после того, как пароль перестаёт использоваться программой, его стоит занулять.
То есть хотелось бы иметь какую-нибудь безопасную строку вместо std::string
, которая при уничтожении или при присваивании ей нового значения зануляла бы область памяти, в которой хранится старая c-style строка.
Реализовать такую строку самостоятельно - не проблема, но всё-таки на реализацию всех широких возможностей std::string
, которые хотелось бы иметь, уйдёт немало времени.
Есть ли уже готовые варианты для такого?
Ответы (1 шт):
Я нашел решение в этом ответе на 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