考虑一个场景,其中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/

10-11 16:12