c++ - 安全的、密码特定的 std::string 在解除分配时将自身归零

标签 c++ security templates c++11 memory

我在 [ 1 ] 找到了与该问题相关的内容,但由于帖子的年龄和 C++11 到那时还没有成熟,它是特定于 Boost 的,但除此之外,我正在寻找一个安全的标准: :string 以下类型的类型定义,在取消分配时将自身归零。

typedef std::basic_string<char, std::char_traits<char>, SecureStr<char>> string;

[ 1 ] - how does one securely clear std::string?

有人知道好的例子吗?代码也不能在编译时被优化掉,这样会损害应用程序的安全性。我知道如果没有在 O/S 和/或编译器中很好地使用 API,这可能是一个很大的问题。

最佳答案

您链接的问题中接受的答案似乎不是特定于 Boost 的;它甚至没有提到升压。它是与 std::basic_string 一起使用的自定义分配器。

但是,它提到根据 basic_string 的实现,实际上可能不会调用分配器; basic_string 可能有空间在内部存储小字符串,而无需单独分配。因此,使用自定义分配器实例化 basic_string 是不够的:除了它可能已分配的任何缓冲区之外,您还需要将字符串对象本身的内存清零。

实现此目的的一种方法是使用由自定义删除函数构造的 unique_ptrunique_ptr 不直接处理分配器,但您可以使用自定义分配器为 basic_string 分配存储空间,然后为其构造一个 unique_ptr一个也委托(delegate)给自定义分配器的删除器。

顺便说一句,当你完成内存时,你只是在考虑清零内存,但另一件需要担心的事情是敏感数据可能会被分页到磁盘。操作系统提供(不可移植的)API 来锁定 RAM 中的少量数据,这样它就不会被调出;您可能想在自定义分配器中利用这些功能。

关于c++ - 安全的、密码特定的 std::string 在解除分配时将自身归零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37580926/

相关文章:

java - 如何使用 SWIG 生成的接口(interface)将字符串从 Java 传递给 C++ 函数

c++ - ofstream::open 创建文件,但随后崩溃(locale::getloc() 中的错误指针?)

java - 我应该更喜欢 ThreadLocalRandom 还是 SecureRandom?

Api Token认证如何避免中间人

c++ - 专用模板根据变量类型返回/设置枚举值

c++ - 如何使用智能指针动态向上转换和向下转换?

c++ - 在 C++ 中是否有等同于 `instancetype` 的东西?

ruby - 在 ruby​​ 程序之间通过互联网发送数据的最快方法?

c++ - 访问模板中的成员: how to check if the template is a pointer or not?

c++ - 获取第一个模板参数的稳健方法