关于安全性:在散列时将密码存储在数据库中不适用

Storing passwords in a database when hashing doesn't apply

关于如何存储用户密码的堆栈溢出有很多问题,一般的建议当然是散列密码和比较散列。

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

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

如果您真的需要获得存储密码的纯文本版本,那么您将如何以最安全的方式处理该问题?


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

存储时应该加密它。不管你怎么看,它都比用纯文本存储要好。假设一个攻击者发现一个SQL注入广告转储了数据库,他仍然没有持有加密密钥。另一方面,如果他能够访问服务器,他可能还会找到加密密钥。

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

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

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


您可以从用户的密码生成加密密钥。(不是他们的外部服务密码,而是他们的服务密码。)由于您没有以纯文本形式存储他们的密码,因此泄露数据库的攻击者将无法解密密码。缺点是当您需要他们的外部密码时,您必须向他们索要密码(为您的服务)。


你的问题颠倒了。问题不在于如何让消费者"查看"密码;而在于如何让消费者验证身份验证。

在您的实现中,提供一种方法,使用户可以提供密码和用户名,并获得"是"或"否"。然后继续在数据库中存储加密(非哈希)密码。