什么时候应该使用SecureZeroMemory()?

3
我找到了一些样例代码,看起来像这样:

addrinfo hints;
SecureZeroMemory(&hints, sizeof(hints));

这里使用SecureZeroMemory()有什么原因吗?为什么不直接使用`memset`?
addrinfo hints = {0};

示例代码: http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms742203(v=vs.85).aspx

这是一个指向微软官方文档的链接,其中包含了与Windows桌面应用程序相关的示例代码。通过阅读这些示例代码,您可以更好地理解如何编写高效、可靠的应用程序。


对我来说看起来有点奇怪。我本来会说这个函数是用于在使用值后清空它们(例如,防止其他进程看到密码)。因此,在这种情况下,我会在C中使用memset或依赖于C++的默认清零行为。 - Dave
getaddrinfo 的文档确实指出 addrinfo 的四个成员必须为零,否则调用将失败,但是没有明显的理由说明为什么 = {0}; 不同样有效。我猜测对于代码示例来说,使用 SecureZeroMemory 调用比 = {0}; 更加自解释。 - T.C.
2个回答

9
如果(例如)变量在当前作用域中不再使用(或者在编译器证明它不会改变程序的内部一致性的任何其他情况下),编译器可以优化掉清零语句。对于安全关键的内存,当涉及到外部进程检查您的内存时,这可能会危及应用程序的安全性。 SecureZeroMemory 的编写方式使其不会被优化掉。
我无法确定为什么这个特定的代码片段选择了该函数而不是其他清零内存范围的方法。这可能是代码作者对其目的的误解或有误导的公司政策的结果。

6

来自MSDN

当您希望确保数据将被迅速覆盖时,请使用此函数代替ZeroMemory,因为某些C++编译器可以通过完全删除它来优化对ZeroMemory的调用。

此外,没有屏障的简单赋值可能会被硬件缓存,并且长时间不会到达RAM。或者一个局部变量可能被优化掉。SecureZeroMemory确保这些都不会发生。

至于为什么要用于初始化addrinfo,这显然与安全无关,让我感到困惑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接