4

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

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

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

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

4

3 回答 3

2

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

于 2011-12-29T22:31:30.777 回答
2

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

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

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

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

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

于 2011-12-30T02:21:11.897 回答
1

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

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

于 2011-12-29T22:27:54.800 回答