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()
?
答案 0 :(得分:11)
SecureZeroMemory 永远不会被编译器优化。如果您需要担心要清理的内存内容,例如它是否包含非常敏感的用户信息,例如,这一点很重要。银行软件,密码等。显然,如果您不需要担心这些事情,您可以使用任何其他方式清理内存缓冲区,或者根本不清除内存缓冲区。
答案 1 :(得分:11)
使用SecureZeroMemory初始化图标信息结构是没有意义的。它只能覆盖应该在其他地方安全擦除的堆栈帧上的字节。那匹马已经逃过了谷仓。完全初始化它甚至没有意义,GetIconInfo()的返回值告诉你它已初始化。
在内存充满安全数据后, SecureZeroMemory()才有意义。