事物存储在内存中的安全性如何?

时间:2011-03-13 04:21:42

标签: c# .net visual-studio-2010

假设我有一个程序将文件读​​入内存并使用某些东西(例如rijndael / AES)对其进行解密。新的未加密的流/字符串/我的程序在内存中保存的内容有多受保护?我意识到即使尝试它也需要一点记忆力,但我只是好奇。我不太了解编程/堆栈/内存如何与.NET / VS2010相关,所以我道歉。在这方面,硬编码字符串的安全性如何(例如,包含为软件制作的用户/ pw的SQL服务器的连接字符串)?

4 个答案:

答案 0 :(得分:4)

根本不安全,即使使用Memory Protection,只需要进行内存转储或使用类似Crack.net的内容来查看内存也是微不足道的。

您可以使用System.Security.SecureString,但是“代表应该保密的文本。文本在使用时加密以保护隐私,并在不再需要时从计算机内存中删除。”

答案 1 :(得分:2)

硬编码字符串根本不安全。从.exe文件中提取所有字符串是一件小事。

内存中的安全性更高一些。现代操作系统有很多内存保护,以防止一个进程读取/修改另一个进程的内存。这可以防止间谍软件从另一个进程的内存段读取密码。

只要你的进程只在内存中保存未加密的值(从不将其写入文件,传输它,将其存储在数据库中等),它就足够安全了。

对于超级机密数据,您必须关心热重启。这是当您的程序将未加密的数据保存在内存中,然后用户重新启动计算机,然后继续读取所有主内存。在这种情况下,存储器仍然可以包含未加密的信息。然而,这有点极端,并且(对于大多数应用程序而言)不值得担心。

总结一下:

  • 内存中未加密的数据= ok
  • .exe file = bad
  • 中硬编码的未加密数据

答案 2 :(得分:1)

如果要将字符串加载到内存中,请使用SecureString类http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx。另见:http://www.vcskicks.com/secure-string.php

答案 3 :(得分:0)

如果不使用专门的API,您应该假设任何可以读取您硬盘的人都可以读取内存中的任何文本,任何可以读取您处理内存的人(例如root或同等文件,来自同一用户的其他进程,或者你的过程中的漏洞利用。)

您的内存可能会被分页到磁盘。某些环境有专门的方法来分配内存以防止分页(我不知道C#标准库是否提供了这样的功能,但我认为可以在Windows上使用它)。