Sé que std::array
está completamente asignado en la pila, pero esta pregunta está motivada por preocupaciones de seguridad que requieren dos cosas:
- Los datos
std::array
serán zerod o aleatorios en la destrucción. - Los datos
std::array
se bloquearán , de modo que nunca irán al disco ni en caso de bloqueo ni de memoria de intercambio
Generalmente, con std::vector
, la solución es crear un asignador personalizado que haga estas cosas . Sin embargo, para std::array
, no veo cómo hacer esto, y de ahí esta pregunta.
Lo mejor que puedo hacer es esto:
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);
}
}
Pero esto obviamente carece de bloqueo de memoria y complica el esquema de rendimiento std::array
que se debe obtener al usar std::array
en primer lugar.
¿Hay alguna solución mejor?
Respuestas:
std::array
no puede usar un asignador; sin embargo, parece que su clase SecureArray puede lograr lo que desea a través de un constructor / deconstructor personalizado.Algo como esto:
fuente
Esto no es completamente cierto.
std::array
no asigna ninguna memoria, por lo que depende de dónde la asigne.En primer lugar, no es un problema bloquear la memoria en la pila. Ver ejemplo POSIX:
Por lo tanto, puede llamar
mlock
o cualquier análogo portátil en elSecureArray
constructor.En segundo lugar, ¿qué aumento de rendimiento espera obtener? La velocidad de lectura / escritura de la memoria no depende de dónde asigne su matriz, en el montón o en la pila. Entonces, se trata de qué tan rápido puede asignar y bloquear la memoria. Si el rendimiento es crítico, el bloqueo de memoria puede ser demasiado lento (o no, ¿quién sabe?) Para llamarlo cada vez en el
SecureArray
constructor, incluso si la memoria está asignada en la pila.Por lo tanto, es más útil de usar
std::vector
con un asignador personalizado. Puede preasignar y prebloquear fragmentos de memoria grandes, por lo que la velocidad de asignación será casi tan rápida como en la pila.fuente
std::array
lugar destd::vector
en primer lugar. Pensé que se trataba de la velocidad de asignación.