【问题标题】:Storing passwords in a database when hashing doesn't apply哈希不适用时将密码存储在数据库中
【发布时间】:2012-01-30 05:52:16
【问题描述】:

Stack Overflow 上有很多关于如何存储用户密码的问题,一般建议当然是对密码进行哈希处理并比较哈希值。

但是,假设您正在构建一个收缩包装的 Intranet 应用程序(如 SharePoint),人们将其部署在他们自己的环境中。并假设它需要用户名/密码组合才能通过 HTTP 访问外部服务(不支持依赖 API 密钥或联合安全性的解决方案)。

在这种情况下,我们不能散列密码,因为我们需要将原始密码传递给我们调用的 Web 服务。加密将是第二好的解决方案,但我们将使用什么作为加密密钥?如果被攻击者破坏了数据库,大概他们首先可以访问用于加密数据的任何密钥?

如果您确实需要获取存储密码的纯文本版本,您将如何以最安全的方式解决问题?

【问题讨论】:

    标签: security passwords password-encryption


    【解决方案1】:

    这实际上是一个非常有趣的问题。我会加入的。

    您应该在存储时对其进行加密。无论您如何看待它,它都比以纯文本形式存储要好。假设攻击者发现一个 sql 注入广告转储了数据库,但他仍然没有持有加密密钥。另一方面,如果他可以访问服务器,他可能还会找到加密密钥。

    为了稍微改进一下,您可以将加密密钥存储在服务器配置中。假设您使用的是 Apache,您可以使用 SetEnv

    我在我的环境中需要在 Apache 启动时输入加密密钥,然后将其存储为 en 环境变量,因此密钥并没有真正存储在我的服务器上的任何位置。

    没有办法,除非你要求用户输入一个密钥来解密你将100%安全的密码。

    【讨论】:

      【解决方案2】:

      您可以根据用户密码生成加密密钥。 (不是他们的外部服务密码——他们的服务密码。)由于您没有以纯文本形式存储他们的密码,因此破坏您的数据库的攻击者将无法解密密码。不利的一面是,当您需要他们的外部密码时,您必须向他们询问他们的密码(用于您的服务)。

      【讨论】:

      • 遗憾的是,在这种情况下不可能让用户每次都输入他们的密码,但如果它是一个非常好的主意!
      【解决方案3】:

      你的问题倒过来了。问题不在于如何让消费者“查看”密码;问题是如何让消费者验证身份验证。

      在您的实施中,提供一种方法,消费者可以通过该方法提供密码和用户名,并获得是或否。然后你继续在数据库中存储加密(非散列)密码。

      【讨论】:

      • 应用程序不向用户显示密码;它在调用 Web 服务时将密码作为基本 HTTP 凭据发送。用户在将 Web 服务“添加”到应用程序时输入一次密码。
      猜你喜欢
      • 2012-11-25
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2011-06-10
      • 2012-04-03
      • 1970-01-01
      • 2016-02-07
      • 2015-10-07
      相关资源
      最近更新 更多