考虑一个场景,其中std::string
用于存储密码。一旦消耗掉了并且不再需要它,清理它会很好,即覆盖包含它的内存,从而隐藏 secret 。std::string
提供了const char* data()
函数,该函数返回指向(自C++ 11起)连续内存的指针。
现在,由于内存是连续的和,该变量将在由于作用域结束而清除后立即销毁,因此可以安全地进行以下操作:
char* modifiable = const_cast<char*>(secretString.data());
OpenSSL_cleanse(modifiable, secretString.size());
根据此处引用的标准:
否则会建议这样做,但是以上条件(连续的,要被删除的条件)是否使其安全?
最佳答案
这可能是安全的。但不能保证。
但是,由于C++11
,必须将std::string
实现为连续数据,以便您可以使用其第一个元素&secretString[0]
的地址安全地访问其内部数组。
if(!secretString.empty()) // avoid UB
{
char* modifiable = &secretString[0];
OpenSSL_cleanse(modifiable, secretString.size());
}
关于c++ - 如何清除(用随机字节覆盖)std::string内部缓冲区?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38702943/