我正在构建一个Web服务,该服务获取其他服务的凭据并代表用户轮询这些服务。即 - 考虑使用电子邮件聚合服务 - 在各种不同的电子邮件提供商处轮询您的帐户,并将它们整理在一个列表中。
在这种情况下,用户提供的密码必须能够被webapp解密,因此可以将它们传递给各种服务进行身份验证。
我应该如何存储这些密码?
我已经阅读了关于在db中存储密码的各种帖子(答案总是'不要'。),但在这种情况下,我看不到替代方案。 (虽然建议欢迎)
答案 0 :(得分:0)
让我们在这里澄清一下:服务器必须能够恢复明文密码。
考虑一些你可能会做的事情:
如果攻击者拥有root权限(但没有任何内容),他们都不会帮助你。如果攻击者切断电源并窃取盒子,大多数人都无法帮助你(RAM不像你想要的那样是非易失性的。)
你想要防御什么攻击?你忽略了什么攻击?
一种可能性是使用从用户密码派生的密钥加密密码(如OSX的Keychain和Windows的等效密码存储,没有人使用)。当用户登录到您的Web服务时,您可以将密钥保留在会话中(或者使用一次性填充对其进行异或,并将填充存储在cookie中,并且仅在用户发送请求时恢复密钥)。这使得从数据库备份中窃取外部密码至少与破解用户密码一样困难。但是,它对其他人没有多大帮助。