【问题标题】:Storing passwords for authentication against another system存储密码以针对另一个系统进行身份验证
【发布时间】:2009-11-03 06:53:21
【问题描述】:

这不是常见的问题“存储纯文本用户的密码安全吗?”。不,这不安全,我们都知道。

我正在编写一个小应用程序,它应该针对外部系统进行身份验证以执行某些操作,唯一可用的身份验证方法是通过用户名和密码。它是为人类设计的,无法更改。

有多个用户可以访问我的应用程序,每个用户都单独进行身份验证,但是他们都针对外部系统“共享”相同的身份验证数据,理想情况下,这些数据由应用程序透明地管理。

“愚蠢”的解决方案是将用户名/密码以纯文本形式存储并用于身份验证,但显然这并不安全。密码可以加密,但如果有人闯入系统怎么办?

可能的解决方案:使用 DPAPI 透明地加密/解密密码(甚至可能是用户名)。这是一个好主意吗?这安全吗?多台机器的设置如何(机器之间的加密是否兼容)?

您还有什么建议吗?

【问题讨论】:

  • 我认为 DPAPI 可能是您最好的选择。我不明白你说的网络农场是什么意思……
  • 我不确定这是否正是您正在寻找的,但是像 DBM 和此类用途这样的散列解决方案呢?对用户的密码进行哈希存储,当他们进行身份验证时,对他们提供的密码进行哈希处理,并将其与现有哈希值进行比较。这是一种常用的密码存储方式。附言- 根据您想要/需要的安全级别,我绝对建议您对哈希进行加盐以避免彩虹表类型的攻击。请参阅最新一期的“2600”,了解有关 Microsoft 长期以来如何使用未加盐的哈希值存储用户密码的文章。
  • @Bob:不是问的!他需要有可用的密码,因为他正在将密码发送到外部系统。他正在针对其他人进行身份验证,而不是在他的系统中进行身份验证。

标签: .net security passwords dpapi


【解决方案1】:

DPAPI 通常不能在网络农场中使用 - 密钥存储是特定于机器的。您没有指定某些用户是否共享一组凭据而另一个用户共享另一组凭据。如果所有用户共享同一组凭据,请将其存储在 web.config 中并使用它。使用配置加密 API 或 web.config 文件上的简单 ACL 保护凭据。

如果不同的用户有不同的第三方系统凭据,我会将凭据与用户一起存储,使用用户密码的哈希值 + 盐作为加密密钥。然后,即使恶意用户获取了您的数据库,他们也必须能够首先解密您的用户密码,然后才能尝试破解第三方密码。盐增加了这样做的难度。

【讨论】:

  • 使用用户的密码哈希(加盐)加密的问题是,设置后很难添加新用户,因为您需要其他人的密码(例如添加用户的管理员) .此外,如果用户更改了她的密码,您必须重新加密她的外部系统凭据的“副本”。这可能是一个可行的解决方案,虽然有点复杂。
  • @Dario 我不确定我是否理解其中的复杂性。鉴于 OP,我假设用户在设置其初始帐户(或第一次访问它)后提供了第三方凭据。鉴于此时用户的密码已经以散列形式可用,因此使用所述散列+盐对用户提供的任何凭据进行加密将是微不足道的。是的,每次用户更改主密码时,您都必须重新加密凭据,但这似乎并不罕见。
【解决方案2】:

请记住,DPAPI 密钥位于用户级别。除非您要为每个用户设置和存储凭据集的单独副本,否则 DPAPI 对您没有任何好处。唯一真正安全的方法是使用“受信任的子系统”模型,您可以在其中以某个用户身份运行 Windows 服务,并将受保护的数据存储在该用户的 HKCU 配置单元中,并使用其 DPAPI 密钥进行加密。它代表用户对需要身份验证的系统执行所有操作,并且用户名/密码不会加载到用户的进程中。即使这样,如果用户是管理员,从技术上讲,他们仍然可以通过调试服务进程来获取用户名/密码。

真正安全的方法是做同样的事情,但远程使用 Windows 凭据向远程服务器授权用户,该服务器代表用户采取行动。真的只是取决于用户名/密码需要有多安全。

【讨论】:

    【解决方案3】:

    您需要保留可用于登录外部系统的纯文本用户名和密码。您可以尝试自己加密此文件,然后在您的应用程序中以某种方式隐藏密钥。

    但是,您的操作系统(例如 Windows)很可能确实提供了保护文件的方法,并且这些方法很可能由经验丰富的专家实施 - 很难建议您花时间自己动手!

    因此,最好的方法是将您的凭据存储为纯文本并依靠操作系统来保护文件,例如

    • 您的网络服务器以自己的用户身份运行的加密主目录,因此只有它可以获取其数据
    • 全盘加密

    如果要无人看管,则需要考虑机器/服务在启动时如何“登录”。

    安全免责声明中涵盖了问题本身,因此这一点无需费力。

    • 它将阻止访问服务器上终端的空闲对等方
    • 它不会阻止专门的攻击者访问运行的机器和物理设备(从火线和 USB 设备到冷却剂攻击的一切基本上都无法防御)
    • 它不会阻止这些凭据在您的服务器和他们正在登录的其他系统之间进行攻击 - 如果它的正常 http 登录到其他系统甚至没有 http-digest 身份验证...李>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多