Wiem, że std::array
jest całkowicie przydzielony na stosie, ale to pytanie jest uzasadnione względami bezpieczeństwa, które wymagają dwóch rzeczy:
- Dane
std::array
zostaną zerowane lub losowo po zniszczeniu - Dane
std::array
zostaną zablokowane , tak aby nigdy nie trafiały na dysk ani w przypadku awarii, ani w pamięci wymiany
Zwykle std::vector
rozwiązaniem jest utworzenie niestandardowego programu przydzielającego, który wykonuje te czynności . Jednak std::array
nie widzę, jak to zrobić, i stąd to pytanie.
Najlepsze, co mogłem zrobić, to:
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);
}
}
Ale to oczywiście nie blokuje pamięci i komplikuje schemat wydajności, std::array
który należy uzyskać, używając std::array
w pierwszej kolejności.
Czy jest jakieś lepsze rozwiązanie?
Odpowiedzi:
std::array
nie może użyć alokatora; Wydaje się jednak, że klasa SecureArray może osiągnąć to, co chcesz, za pomocą niestandardowego konstruktora / dekonstratora.Coś takiego:
źródło
To nie do końca prawda.
std::array
nie przydziela żadnej pamięci, więc zależy to od tego, gdzie ją przydzielisz.Po pierwsze, zablokowanie pamięci na stosie nie stanowi problemu. Zobacz przykład POSIX:
Możesz więc po prostu wywołać
mlock
lub dowolny przenośny analog wSecureArray
konstruktorze.Po drugie, jakiego wzrostu wydajności oczekujesz? Szybkość odczytu / zapisu pamięci nie zależy od tego, gdzie przydzielisz tablicę, na stercie lub na stosie. Chodzi więc o to, jak szybko można przydzielić i zablokować pamięć. Jeśli wydajność jest krytyczna, blokowanie pamięci może być zbyt wolne (czy nie, kto wie?), Aby wywoływać ją za każdym razem w
SecureArray
konstruktorze, nawet jeśli pamięć jest przydzielona na stosie.Dlatego bardziej przydatne jest użycie
std::vector
niestandardowego programu przydzielającego. Może wstępnie alokować i blokować duże porcje pamięci, więc szybkość alokacji będzie prawie tak duża jak na stosie.źródło
std::array
zamiaststd::vector
na pierwszym miejscu. Myślałem, że chodzi o szybkość przydziału.