私std::array
は完全にスタックに割り当てられていることを知っていますが、この質問は2つのことを必要とするセキュリティの懸念によって動機付けられています:
- のデータは
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
おり、そもそも使用することで得られるパフォーマンススキームが複雑になります。
より良い解決策はありますか?