【问题标题】:C++: Overwrite std::string in CacheC++:覆盖缓存中的 std::string
【发布时间】:2016-01-25 10:20:21
【问题描述】:

我有一个字符串变量(包含密码),并会在释放变量之前like to overwrite it's value with a sequence of '0'。我坚持做这样的事情:

void overwrite(std::string &toOverwrite){
    if(toOverwrite.empty())
        return;
    else{
        std::string removeString;
        size_t length = toOverwrite.size();
        for(int i = 0; i < length; i++){
            removeString += "0";
        }
       toOverwrite = removeString;
    }    
}

但不知何故,这感觉不对。

  1. 首先是因为它似乎在 for 循环中产生了很多开销。
  2. 此外,我不确定最后一行是否真的会覆盖字符串。我知道,例如在 Java 中,字符串是不可变的,因此根本不能被覆盖。它们在 C++ 中不是不可变的(至少不是 std::string),但 toOverwrite = removeString 会真正替换 toOverwrite 或者只是让 toOverwrite 的“指针”指向 removeString
  3. 我的编译器有可能会optimize the code and removes this overwriting吗?

也许我应该使用std::string::replace 方法或将数据类型更改为char* / byte[]?

【问题讨论】:

  • 就循环开销而言,您可以使用std::string removeString(toOverwrite.size(), '0'); 初始化您的字符串——但这不会解决您的第二个和第三个问题。

标签: c++ string


【解决方案1】:

可能只是交换和释放指针,将密码短语留在内存中不再指向的某个位置。如果要覆盖字符串数据,请执行以下操作:

std::fill(toOverwrite.begin(), toOverwrite.end(), '0');

而且您也不需要对空字符串进行测试。

【讨论】:

  • 如果不再使用该字符串,编译器仍有可能对其进行优化。
  • 我想真正保证字符串将被覆盖的唯一方法是添加一些内联汇编代码?
  • @Galik 编译器可以选择将 overwrite() 设为内联,这样就可以很容易看出字符串中的值不再使用了。
  • @mindriot 我相信组装也可以优化。唯一确定的方法是使用 OS API,即 Windows 上的SecureZeroMemory
  • 动态库然后......(在出现更多意想不到的优化可能性的情况下偷偷摸摸地看着)。
猜你喜欢
  • 2022-06-14
  • 2022-11-04
  • 2018-12-30
  • 2017-09-19
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 2017-03-26
  • 2013-11-16
相关资源
最近更新 更多