Saya tahu std::array
benar-benar dialokasikan dalam tumpukan, tetapi pertanyaan ini dimotivasi oleh masalah keamanan yang memerlukan dua hal:
- Data di
std::array
akan zerod atau acak pada kehancuran - Data di
std::array
akan dikunci , sehingga tidak pernah masuk ke disk baik pada crash atau pada memori swap
Biasanya, dengan std::vector
, solusinya adalah membuat pengalokasi khusus yang melakukan hal-hal ini . Namun, untuk std::array
, saya tidak melihat bagaimana melakukan ini, dan karenanya pertanyaan ini.
Yang terbaik yang bisa saya lakukan adalah ini:
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);
}
}
Tapi ini jelas tidak memiliki penguncian memori dan menyulitkan skema kinerja std::array
yang harus diperoleh dengan menggunakan std::array
di tempat pertama.
Apakah ada solusi yang lebih baik?
Jawaban:
std::array
tidak dapat menggunakan pengalokasi; namun, sepertinya kelas SecureArray Anda dapat mencapai apa yang Anda inginkan melalui konstruktor / dekonstruksi kustom.Sesuatu seperti ini:
sumber
Ini tidak sepenuhnya benar.
std::array
tidak mengalokasikan memori apa pun, jadi itu tergantung di mana Anda mengalokasikannya.Pertama, itu tidak masalah untuk mengunci memori di tumpukan. Lihat contoh POSIX:
Jadi, Anda bisa memanggil
mlock
atau analog portabel diSecureArray
konstruktor.Kedua, kenaikan kinerja apa yang Anda harapkan? Kecepatan membaca / menulis memori tidak tergantung pada di mana Anda mengalokasikan array Anda, pada heap atau pada stack. Jadi, ini semua tentang seberapa cepat Anda dapat mengalokasikan dan mengunci memori. Jika kinerjanya kritis, penguncian memori mungkin terlalu lambat (atau tidak, siapa tahu?) Untuk memanggilnya setiap kali dalam
SecureArray
konstruktor bahkan jika memori dialokasikan pada stack.Jadi, lebih mudah digunakan
std::vector
dengan pengalokasi khusus. Ini mungkin melakukan preallocate dan prelock big memory chunks, jadi kecepatan alokasi akan hampir secepat di stack.sumber
std::array
daripadastd::vector
di tempat pertama. Saya pikir ini tentang kecepatan alokasi.