相关疑难解决方法(0)

如何确保编译器优化不会带来安全风险?

我必须编写一个Windows服务,在某些时候处理机密数据(如PIN码,密码等).这些信息需要很短的时间:通常它们几乎立即被发送到智能卡读卡器.

让我们考虑这段代码:

{
  std::string password = getPassword(); // Get the password from the user

  writePasswordToSmartCard(password);

  // Okay, here we don't need password anymore.
  // We set it all to '\0' so it doesn't stay in memory.
  std::fill(password.begin(), password.end(), '\0');
}
Run Code Online (Sandbox Code Playgroud)

现在我关心的是编译器优化.在这里,编译器可能会检测到密码即将被删除,并且此时更改其值是无用的,只需删除该调用即可.

我不希望我的编译器关心未来未引用的内存的价值.

我的担忧是否合法?我怎么能确定这样的代码不会被优化?

c++ memory compiler-construction security optimization

39
推荐指数
3
解决办法
2495
查看次数

如何编写密码安全类?

这个问题遵循@sharptooth在这个相关问题中提出的建议.

可以std::string调整,以便它变得密码安全吗?

如果没有,什么是写有密码处理类(因此类,它大关心它写入内存和破坏之前将其清除)的指导方针?

c++ memory string

14
推荐指数
1
解决办法
4954
查看次数

没有优化的清零内存

如您所知,如果稍后不访问memset()内存,我们不能将其用于清零,因为它可能会被编译器优化。我看到了一个建议,在CPP参考,我们可以用一个指针来解决这个问题。现在这是我的问题:std::fillvolatile

  1. 这个语句是否意味着如果指针不是volatilestd::fill也可以优化?
  2. 例如,我们如何获得指向容器的 volatile 指针vector?这样的东西有用吗?
vector<int> v;
volatile auto ptr = v.data();
Run Code Online (Sandbox Code Playgroud)

c++

5
推荐指数
1
解决办法
103
查看次数