【问题标题】:Automatically clear contents securely of C++ std::string and std::vector on destructor [duplicate]在析构函数上自动安全地清除 C++ std::string 和 std::vector 的内容 [重复]
【发布时间】:2016-10-20 11:19:12
【问题描述】:

我想从 std::string 和 std::vector 元素存储的内存中安全地清除(在简单的情况下,将内容设置为零)敏感信息。我的向量还可以包含原始类型(例如 std::vector),所以我想清除向量的析构函数内所有包含的元素会更方便,因为原始类型没有析构函数。我不能用继承覆盖 std::string 和 std::vector 类,因为这些类型不是为此而设计的(没有虚拟析构函数等)。还有其他方法吗?我发现了一些带有 std::string 自动清除的帖子,但那里的示例实现都不完整。目前我在使用完对象后通过手动将内容设置为零来清除我的对象,但这非常乏味。

编辑:以这种方式清除内存也不安全,因为 C++ 容器可以在某些操作期间分配/释放内存。这就是为什么使用分配器(在类似问题中描述)可能是唯一的方法,至少对于不使用 SSO(短字符串优化)的较长字符串。

【问题讨论】:

  • 你可以在向量上迭代并在删除它之前将元素设置为 0。
  • @Hayt 由于 as-if 规则,允许编译器忽略此类分配。更多here
  • @Hayt 可能会被优化掉。
  • 同样的分配器技巧也适用于vector
  • Ib4 “我发现了一些带有 std::string 自动清除的帖子,但那里的示例实现都不完整。” 这并不能说明问题不是骗人的。如果受骗者需要更好的答案,请提供您的理由(需要一些代表,但不多)以吸引更多答案。

标签: c++ c++11


【解决方案1】:

不,具有讽刺意味的是,面向对象的设计应该完全支持这种事情。实际上它不起作用。

但是,您可以做的是重载 new/delete 运算符来调用 mymalloc()、myshreddingfree()、myshreddingfree,以便擦除已释放的块(因此您需要 mymalloc 来标记它的大小)。这有点繁琐,但 C++ 允许。

【讨论】:

  • 我猜你的意思是在全球范围内重载 new/delete。但这将是巨大的开销。我无法在不必要的情况下对每次释放进行安全擦除。
猜你喜欢
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 2018-01-27
  • 2014-05-07
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多