这个MSND的文章说SecureZeroMemory()
是适用于在一段时间内存储在内存中的敏感数据在不再需要时确实被覆盖的情况。 这个问题的答案解释了为什么这可以有所作为。
现在有没有使用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()
吗?
使用SecureZeroMemory初始化图标信息结构是没有意义的。 它只能覆盖应该在别处安全擦除的堆栈帧的字节。 那匹马已经逃出了谷仓。 根本不需要初始化它,GetIconInfo()的返回值告诉你它被初始化了。
SecureZeroMemory()只有在内存充满安全数据后才有意义。
SecureZeroMemory 永远不会被编译器优化。 如果您需要担心要清理的内存内容,比如说是否包含非常敏感的用户信息,例如银行软件,密码等,这一点很重要。显然,如果您不需要担心这些事情,您可以如果没有必要,可以使用任何其他方式清理内存缓冲区,或者根本不清理内存缓冲区。