我知道它std::array
是完全分配在堆栈中的,但是这个问题是由需要考虑两点的安全问题引起的:
- 输入的数据在
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
。
有更好的解决方案吗?
评论不作进一步讨论;此对话已转移至聊天。
—
塞缪尔·刘
对不起,那是给mods的;另一个是拒绝标志的国防部,不是你。当然,您唯一能做的就是指出答案是否正确,因此我可以将赏金分配给最佳答案。我当然可以评估自己,但是我不是那么出色的专家。一旦分配了赏金的原因就消失了。
—
Maarten Bodewes
@ Maarten-reinstateMonica不幸的是,没有一个答案能以干净的方式解决问题。
—
量子物理学家
@TheQuantumPhysicist被认为是一种干净的方法是什么?您可以尝试使这些要求明确吗?这也有助于考虑可能的解决方案。我想我可能知道您的意思,但我也认为您可能更精确。
—
Maarten Bodewes,
@ Maarten-reinstateMonica使用我们已经以某种方式拥有的分配器。从头开始重写内容是个坏主意,并且需要进行大量测试。那应该是最后的手段。下面的答案提出了一些显而易见的解决方案,我已经在评论中避免了(在将其移至聊天之前)。
—
量子物理学家