我必须编写一个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)
现在我关心的是编译器优化.在这里,编译器可能会检测到密码即将被删除,并且此时更改其值是无用的,只需删除该调用即可.
我不希望我的编译器关心未来未引用的内存的价值.
我的担忧是否合法?我怎么能确定这样的代码不会被优化?
这个问题遵循@sharptooth在这个相关问题中提出的建议.
可以std::string调整,以便它变得密码安全吗?
如果没有,什么是写有密码处理类(因此类,它大关心它写入内存和破坏之前将其清除)的指导方针?
如您所知,如果稍后不访问memset()内存,我们不能将其用于清零,因为它可能会被编译器优化。我看到了一个建议,在CPP参考,我们可以用一个指针来解决这个问题。现在这是我的问题:std::fillvolatile
volatile,std::fill也可以优化?vector?这样的东西有用吗?vector<int> v;
volatile auto ptr = v.data();
Run Code Online (Sandbox Code Playgroud)