当安全性不是问题时,有什么理由使用SecureZeroMemory()而不是memset()或ZeroMemory()?

时间:2010-01-06 11:38:19

标签: c++ windows language-agnostic visual-c++ initialization

This MSND article表示SecureZeroMemory()适用于存储在内存中一段时间​​的敏感数据应该在不再需要时尽快被覆盖的情况。 this SO question的答案解释了为什么这会产生影响。

现在有没有使用SecureZeroMemory()初始化每个内存块?例如,在一个项目中,我看到如下代码:

ICONINFO ii; 
::SecureZeroMemory(&ii, sizeof(ICONINFO)); 
if (::GetIconInfo(hIcon, &ii)) 
{
    //do stuff, then 
    //release bitmaps 
    if(ii.hbmMask) 
        ::DeleteObject(ii.hbmMask); 
    if(ii.hbmColor) 
        ::DeleteObject(ii.hbmColor); 
} 

为什么在这里使用SecureZeroMemory()代替ZeroMemory()memset()或值初始化?我的意思是如果编译器决定初始化是不必要的并且想要优化它 - 为什么我会强制执行它?有没有理由在这里使用SecureZeroMemory()

2 个答案:

答案 0 :(得分:11)

SecureZeroMemory 永远不会被编译器优化。如果您需要担心要清理的内存内容,例如它是否包含非常敏感的用户信息,例如,这一点很重要。银行软件,密码等。显然,如果您不需要担心这些事情,您可以使用任何其他方式清理内存缓冲区,或者根本不清除内存缓冲区。

答案 1 :(得分:11)

使用SecureZeroMemory初始化图标信息结构是没有意义的。它只能覆盖应该在其他地方安全擦除的堆栈帧上的字节。那匹马已经逃过了谷仓。完全初始化它甚至没有意义,GetIconInfo()的返回值告诉你它已初始化。

在内存充满安全数据后, SecureZeroMemory()才有意义