关于内存中密码的常见做法

Posted

技术标签:

【中文标题】关于内存中密码的常见做法【英文标题】:Common Practice regarding Passwords in Memory 【发布时间】:2011-06-19 21:38:58 【问题描述】:

我正在编写一个 .net(C#) Windows 应用程序来在其中存储用户密码,例如 keypass、lastpass、roboforms 等。

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

现在我的问题是:

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

谢谢

【问题讨论】:

【参考方案1】:

您的担心是正确的,内存中的字符串不安全。

您可能正在寻找 SecureString 类。

【讨论】:

【参考方案2】:

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

一般规则是,如果有人可以访问该机器,那么它的游戏就会超过安全性。

【讨论】:

-1 首先,这不以任何方式回答 OP 的问题,您的情况只有一种可能。应用程序中仍然可能存在允许攻击者读取(随机)内存的错误。 SecureString 对于这种情况是完全有效的,因为您可以在不需要对象时立即释放它。用字符串你不能。当您的网页或应用程序崩溃并创建内存转储(即操作系统崩溃并且您提交转储以供开发人员跟踪)时,其他情况可能是信用卡信息等敏感信息。有了字符串,现在你也发送了非常明智的信息 @Tseng。提问者问他如何使用直接访问内存的工具来保护密码不被别人使用。我的回答(我站在后面)说如果攻击者可以访问内存,那么你无能为力。安全字符串在极少数情况下可能会有所帮助,但它绝对不能解决问题。在您的场景中,当敏感信息为纯文本时,可能会进行内存转储。 "1. 有人可以使用某些工具或 内存转储 读取内存数据吗?"明确包括内存转储,当您的操作系统崩溃并提交时也会发生这种情况 尽管您有一个观点,但存在可能引起关注的有效场景。冻结内存可以在断电后从中恢复数据(之后您可以使用自己的内核重新启动)。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于关于内存中密码的常见做法的主要内容,如果未能解决你的问题,请参考以下文章

在常量对象中定义所有通量动作类型是一种常见的做法吗?

常见的关于堆栈以及list集合的考察方面

前后端分离 | 关于登录状态那些事

关于DTO的个人理解

Android性能优化:阿里腾讯等关于内存泄露的知识都在这里了!

关于message的内存优化