我在 [ 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_ptr
。 unique_ptr
不直接处理分配器,但您可以使用自定义分配器为 basic_string
分配存储空间,然后为其构造一个 unique_ptr
一个也委托(delegate)给自定义分配器的删除器。
顺便说一句,当你完成内存时,你只是在考虑清零内存,但另一件需要担心的事情是敏感数据可能会被分页到磁盘。操作系统提供(不可移植的)API 来锁定 RAM 中的少量数据,这样它就不会被调出;您可能想在自定义分配器中利用这些功能。
关于c++ - 安全的、密码特定的 std::string 在解除分配时将自身归零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37580926/