Ich weiß, dass std::array
der Stapel vollständig zugeordnet ist, aber diese Frage ist durch Sicherheitsbedenken motiviert, die zwei Dinge erfordern:
- Die Daten in
std::array
werden bei Zerstörung auf Null gesetzt oder zufällig ausgewählt - Die eingehenden Daten
std::array
werden gesperrt , sodass sie weder beim Absturz noch im Swap-Speicher auf die Festplatte übertragen werden
Normalerweise besteht std::vector
die Lösung darin, einen benutzerdefinierten Allokator zu erstellen , der diese Aufgaben ausführt . Doch für die std::array
, ich sehe nicht , wie dies zu tun , und deshalb wird diese Frage.
Das Beste, was ich tun kann, ist Folgendes:
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);
}
}
Dies fehlt jedoch offensichtlich die Speichersperre und verkompliziert das Leistungsschema, std::array
das durch std::array
die erstmalige Verwendung erreicht werden soll.
Gibt es eine bessere Lösung?
Antworten:
std::array
kann keinen Allokator verwenden; Es scheint jedoch, dass Ihre SecureArray-Klasse durch einen benutzerdefinierten Konstruktor / Dekonstruktor das erreichen kann, was Sie wollen.Etwas wie das:
quelle
Das ist nicht ganz richtig.
std::array
weist keinen Speicher zu, daher hängt es davon ab, wo Sie ihn zuweisen.Erstens ist es kein Problem, den Speicher auf dem Stapel zu sperren. Siehe POSIX-Beispiel:
Sie können also einfach ein
mlock
beliebiges tragbares Analogon imSecureArray
Konstruktor aufrufen .Zweitens, welchen Leistungsgewinn erwarten Sie? Die Lese- / Schreibgeschwindigkeit des Speichers hängt nicht davon ab, wo Sie Ihr Array, den Heap oder den Stapel zuweisen. Es geht also darum, wie schnell Sie den Speicher zuweisen und sperren können. Wenn die Leistung kritisch ist, ist die Speichersperre möglicherweise zu langsam (oder nicht, wer weiß?), Um sie jedes Mal im
SecureArray
Konstruktor aufzurufen, selbst wenn Speicher auf dem Stapel zugewiesen ist.Daher ist die Verwendung
std::vector
mit einem benutzerdefinierten Allokator praktischer . Es kann große Speicherblöcke vorab zuweisen und vorab sperren, sodass die Zuweisungsgeschwindigkeit fast so hoch ist wie auf dem Stapel.quelle
std::array
anstattstd::vector
an erster Stelle zu verwenden. Ich dachte, es geht um die Zuweisungsgeschwindigkeit.