2011-12-29 64 views
4

关于如何存储用户密码的Stack Overflow有很多问题,当然一般建议是散列密码和比较散列。当散列不适用时将密码存储在数据库中

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

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

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

回答

2

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

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

为了改善这一点,您可以将加密密钥存储在服务器配置中。假设你使用Apache,你可以使用SetEnv

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

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

1

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

在您的实施中,提供一种方法,让消费者可以提供密码和用户名,并获得yes或no。然后,您继续在数据库中存储加密(不散列)的密码。

+0

应用程序不向用户显示密码;它在调用Web服务时将密码作为基本HTTP凭据发送。用户在将Web服务“添加”到应用程序时输入一次密码。 – 2011-12-30 01:13:54

2

您可以从用户的密码生成加密密钥。 (不是他们的外部服务密码 - 他们服务的密码。)由于您没有以纯文本格式存储他们的密码,因此攻击者破坏数据库将无法解密密码。不利之处在于,无论何时需要他们的外部密码,您都必须要求他们输入密码(用于您的服务)。

+0

在这种情况下,每次都无法让用户输入密码,但如果是这样的话,这真是个好主意! – 2011-12-30 01:16:32

相关问题