【问题标题】:Is keeping encrypted password in memory for later use safe?将加密的密码保存在内存中以备后用安全吗?
【发布时间】:2013-12-13 15:46:41
【问题描述】:

我正在接收用户名和密码,我正在使用它们创建与 Web 服务的连接,然后使用该服务使用各种功能。

但是,我想将用户名存储为纯文本和加密密码,以便以后进行自动诊断,我可以在 catch() 中调用一个方法,该方法将使用相同的用户名和解密密码重新初始化连接。

我在加密和解密方面没有太多经验,但我可以使用here建议的方法制作它们private

当然,我还会清除存储密码的临时变量,甚至是 TextBox 文本。

但我想知道将加密密码保存在内存中是否安全?

【问题讨论】:

  • 不是,垃圾收集器将副本保存在内存中,这些副本是遥不可及的。而且您不能“删除”字符串,它们是不可变的。 SecureString 类的原因。
  • 改用单向哈希 - SHA1/SHA256。
  • 我担心你缺乏背景(甚至比我更多)来正确地做到这一点。一些注意事项:private 对阻止黑客没有任何作用(尤其是如果他们可以随意检查内存),即使它可以隐藏加密例程,这也将通过默默无闻来保证安全,“删除临时变量”可能不起作用你希望它做什么(假设你的意思是string s = plaintext; ...; s = null;),如果你也保持密钥可用,你只会最小限度地阻止攻击者。如果有什么误解请告诉我。
  • @delnan 好吧,你没有错过任何解释,但是解决方案是什么?
  • @Mahesha999 回复TextBox,更好的选择取决于很多内部细节。可能有一个小部件可以提供这样的保证(对于字符串,有SecureString),我不是很精通Windows UI 编程。

标签: c# security encryption


【解决方案1】:

您应该真正散列密码,而不是加密它。也就是说,如果密码经过哈希处理,您(以及扩展的攻击者)不应该能够“解密”他们提供给您的密码。

在内存中存储散列密码是合理的。无论如何,它必须在某个时候在内存中。

【讨论】:

  • 但很着急,因为会一直保存在内存中,是否有其他标准方法遵循?
  • 通常人们将其存储在数据库中,但您的安全性不应围绕哈希密码在内存中的时间长度
  • @Oleksi 在程序中戳是一种合法且有时非常有效的攻击。唯一的缺点是它需要对计算机进行物理访问,或者运行任意代码(在正确的时间并具有足够的权限来回避内存保护)。将物理 RAM 中的时间关键数据最小化可以最小化攻击窗口,尽管它显然不会关闭它。
  • 另外,(将我的评论复制给其他人)如果您只需要验证某人输入了正确的密码,那么散列是很好的,但这里程序需要将密码本身发送给几个第三方服务,所以这些可以验证密码以进行身份​​验证。
【解决方案2】:

只是为了确保我正确理解您的问题:

  1. 您正在编写客户端软件
  2. 用户输入密码
  3. 您将密码短时间存储在一个变量中,以对 Web 服务进行身份验证
  4. 您想知道是否可以将密码存储在内存中(即在变量中)更长的时间,以便以后再次对 Web 服务进行身份验证

如果这些假设是正确的:不要太担心,只需将其保存在一个变量中即可 - 最好按照 Hans Passant 的建议保存在 SecureString 中。 SecureString 将为您完成工作:

SecureString 对象的值是自动加密的,可以修改,直到您的应用程序将其标记为只读,并且可以由您的应用程序或 .NET Framework 垃圾收集器从计算机内存中删除。

哈希在密码(或哈希)存储在磁盘/数据库中的服务器端是有意义的。在客户端,您无法对密码进行哈希处理,因为您需要它来验证 Web 服务。

如果您想永久存储密码(即将其写入文件),那么您需要担心加密/散列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多