记忆中密码的一般实践

我正在写一个.NET(C#)的Windows应用程序来存储用户密码,如keypass,lastpass,roboforms等。

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

现在我的问题是:

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

谢谢

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

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

你的担心是正确的,记忆中的字符串是不安全的。
您可能正在寻找SecureString类。

如果你担心有人窥探内存的密码,那么你有更重要的问题。 如果恶意用户可以访问RAM,那么将键盘记录器放到机器上,或绕过在软件中使用密钥,或者在密钥被解密后拦截密钥,都是微不足道的。 等等

一般的规则是,如果有人可以访问机器,那么它的游戏安全明智。

我建议探索Keepass (2.xx版本)的源代码。 它是用.NET编写的,它处理你关心的同样的问题。

我的经验在安全方面是有限的,但我希望这将是有益的

  1. 是的,这是可能的
  2. 您可以使用WinDbg + SOS从对象的内部表示中获取所需的任何内容
  3. 在BCL中有一个叫做SecureString的特殊类,应该适合你的需要。