关于记忆中密码的常见实践

时间:2011-02-02 10:56:28

标签: .net windows security memory-management

我正在编写.net(C#)windows应用程序来存储用户密码,如keypass,lastpass,roboforms等。

要处理用户数据,我必须将其保存在内存中,此数据还包含用户的密码。

现在我的问题是:

  1. 有人可以使用某些工具或内存转储读取内存数据吗?
  2. 如果是,那么如何?有人可以分享这样的工具?我尝试使用CurrProcess,HeapViewer,ProcessExplorer和ProcessView应用程序,但在内存转储中找不到任何私有数据,
  3. 我是否需要学习其他内容以确保内存密码的保护。
  4. 由于

5 个答案:

答案 0 :(得分:9)

你的顾虑是正确的,记忆中的字符串是不安全的。

您可能正在寻找SecureString课程。

答案 1 :(得分:7)

如果您担心某人窥探RAM以获取密码,那么您会遇到更多重大问题。如果恶意用户可以访问RAM,那么将键盘记录器放到机器上,或绕过软件中使用密钥的位置,或者解密后拦截密钥都是微不足道的。等等

一般规则是,如果某人有权访问该机器,那么它的游戏就是明智的。

答案 2 :(得分:4)

是的,存在捕获所有物理内存(和页面文件)以供进一步调查的工具。它们被称为“取证”,您可以通过在搜索中添加此关键字来找到一些。如果你想在代码中捕获内存(即自己编写这样的程序),可以使用我们的RawDisk产品。

至于保护你的密码,Kobi提到SecureString类,它应该安全地将字符串存储在内存中。虽然这个类不是100%保护(密码在你使用它时仍然被解密),但是密码捕获的可能性要小得多。

答案 3 :(得分:1)

我建议您浏览Keepass(版本2.xx)的源代码。它是用.NET编写的,它处理您所关注的相同问题。

答案 4 :(得分:1)

我的经验在安全方面有限,但我希望这会有所帮助

  1. 是的,可能
  2. 您可以使用WinDbg + SOS从对象的内部表示中获取您想要的任何内容
  3. BCL中有一个名为SecureString的特殊类,可以满足您的需求。