使用SecureZeroMemory()真的有助于使应用程序更安全吗?

时间:2009-04-24 14:32:14

标签: c++ security winapi

WinAPI中有一个SecureZeroMemory()函数,用于在不再需要缓冲区时擦除用于存储密码/加密密钥/类似内容的内存。它与ZeroMemory()的不同之处在于它的调用不会被编译器优化。

是否真的有必要擦除用于存储敏感数据的内存?它真的能使应用程序更安全吗?

我知道数据可以写入交换文件或休眠文件,其他进程可能会读取我程序的内存。但是当数据仍在使用时,同样可能发生。为什么使用,然后擦除而不仅仅是使用

5 个答案:

答案 0 :(得分:10)

确实如此。例如,休眠文件未加密。如果你没有安全地清除内存,你可能会遇到麻烦。不过,这只是一个例子。只要需要,你应该始终在内存中保存秘密内容。

答案 1 :(得分:5)

它存在是有原因的。 :) 如果将敏感数据保留在内存中,则其他进程可能会读取它。

当然,在您的应用程序中,密码或其他安全数据可能不是那么重要,需要这样做。但在某些应用程序中,恶意代码不仅可以窥探您的密码或信用卡号或应用程序使用的任何其他数据,这一点非常重要。

答案 2 :(得分:4)

另请注意,某些操作系统在将其提供给应用程序之前不会将内存归零,这意味着应用程序可能会随机请求内存,扫描可能有趣的内容并对其执行某些操作。

如果该应用程序只能获得零内存,那么尝试获取有趣数据会更难。

答案 3 :(得分:3)

SecureZeroMemory()肯定不会让您的应用程序完全安全。密码已经在内存中的事实已经是一个安全漏洞。使用SecureZeroMemory()肯定会降低您检索密码的可能性。我认为没有任何理由不使用它,为什么不呢?请记住,还有许多其他事情你也要担心。

答案 4 :(得分:3)

如果你确实有密码数据或其他秘密,你也要确保它们所在的内存不会被换出,否则交换文件会成为一个问题(我认为你的功能)想要是一个Windows应用程序的'VirtualLock')。此外,您还需要检测进入hibrenate的窗口并在此时擦除数据。我相信Windows会在每个应用程序即将重新启动时向每个应用程序发送消息。