【问题标题】:How to Protect Sensible Passwords stored in a Database如何保护存储在数据库中的敏感密码
【发布时间】:2011-01-19 15:04:38
【问题描述】:

我正在开发一个 Web 应用程序,最终用户必须为其创建一个帐户。这部分非常简单:我将使用 SHA-256 对他们的密码进行哈希处理,这样除了用户自己之外,没有人知道密码。现在是困难的部分。用户创建帐户后,他/她必须提供他/她的电子邮件服务器的密码。现在的问题是:我怎样才能体面地保护这个密码(密码将存储在数据库中)?如果我用 TripleDES 加密密码,任何开发人员或系统管理员都可以解密密码并看到它。处理此类问题的通常方法是什么?非常感谢。

【问题讨论】:

  • 开发人员不应访问生产数据库。
  • 可能,您无法控制用户使用哪些电子邮件服务器,但在这种情况下,用户希望第二方(您)访问他的某些资源,由第三方托管(用户的邮件服务器),在不泄露 3rd-party-password 的情况下,发明了 3-legged-oauth

标签: database passwords encryption


【解决方案1】:

执行此操作的常用方法是使用从用户密码派生的对称加密密钥。执行此操作的标准方法是使用RFC2898 中指定的算法,该算法会生成一组可用作密钥和 IV 的加密安全字节。它可能由您的语言的库支持,例如 .NET,我使用的是 Rfc2898DeriveBytes 类。

当然,当您的用户更改密码时,您必须解密任何现有的密文,然后派生新密钥并重新加密。

【讨论】:

  • 警告:这意味着您需要将用户密码从客户端传输到服务器,因此连接必须是安全的。散列密码的优点之一是您可以在客户端计算机上散列用户的条目,然后仅将散列传输到服务器。但是,假设连接安全,Blowdart 的建议具有巨大优势,即为每个用户的数据使用不同的加密密钥,从而大大降低了泄露的威胁。
  • 通常您正在将用户密码从客户端传输到服务器,但是一旦它到达服务器,您就会对其进行散列以进行比较。因此,您要做的是在对密码检查进行哈希处理的同时,您将派生密钥并将其置于服务器上的会话状态,以便您可以在整个用户会话中使用它。
  • 为什么要使用对称加密而不是加密哈希?在登录期间,您重新散列提供的输入并将其与存储的加盐散列进行比较;如果匹配,您批准登录。然后系统管理员或开发人员无法解密用户的密码,但可以更改。
  • 没关系,我只是想通了;我没有仔细阅读OP需要原始明文来访问第三方帐户。无视我。
猜你喜欢
  • 1970-01-01
  • 2019-09-07
  • 2017-07-25
  • 1970-01-01
  • 2021-04-10
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多