Я знаю, std::array
что полностью распределен в стеке, но этот вопрос мотивирован проблемами безопасности, которые требуют двух вещей:
- Данные в
std::array
нуле или будут рандомизированы при уничтожении - Данные в
std::array
будут заблокированы , так что они никогда не попадут на диск ни в случае сбоя, ни в разделе подкачки
Обычно std::vector
решение заключается в создании собственного распределителя, который делает эти вещи . Тем не менее, std::array
я не вижу, как это сделать, и, следовательно, этот вопрос.
Лучшее, что я мог сделать, это:
template <typename T, std::size_t Size>
struct SecureArray : public std::array<T, Size>
{
static_assert(std::is_pod<T>::value, "Only POD types allowed")
static_assert(sizeof(T) == 1, "Only 1-byte types allowed")
virtual ~SecureArray()
{
std::vector<uint8_t> d = RandomBytes(Size); // generates Size random bytes
std::memcpy(this->data(), d.data(), Size);
}
}
Но это, очевидно, не std::array
требует блокировки памяти и усложняет схему производительности, которую нужно получить, используя std::array
в первую очередь.
Есть ли лучшее решение?
Ответы:
std::array
не может использовать распределитель; однако кажется, что ваш класс SecureArray может достичь того, чего вы хотите, с помощью собственного конструктора / деконструктора.Что-то вроде этого:
источник
Это не совсем так.
std::array
не выделяет никакой памяти, поэтому это зависит от того, где вы ее выделите.Во-первых, это не проблема для блокировки памяти в стеке. Смотрите пример POSIX:
Итак, вы можете просто позвонить
mlock
или любой портативный аналог вSecureArray
конструкторе.Во-вторых, какой прирост производительности вы ожидаете получить? Скорость чтения / записи в память не зависит от того, где вы разместите свой массив, в куче или в стеке. Итак, все дело в том, как быстро вы можете выделить и заблокировать память. Если производительность критична, блокировка памяти может быть слишком медленной (или нет, кто знает?), Чтобы вызывать ее каждый раз в
SecureArray
конструкторе, даже если память выделена в стеке.Таким образом, это более удобно для использования
std::vector
с пользовательским распределителем. Он может предварительно выделять и предварительно блокировать большие фрагменты памяти, поэтому скорость выделения будет почти такой же высокой, как в стеке.источник
std::array
вместо того, чтобыstd::vector
в первую очередь. Я думал, что это о скорости распределения.