2010-08-18 104 views
0

我正在构建一个Web服务,它接受其他服务的凭据并以用户名义轮询这些服务。也就是说 - 考虑一个电子邮件聚合服务 - 在各种不同的电子邮件提供商处对您的帐户进行轮询,并将它们整理到一个列表中。哪种编码用于存储可解密的密码?

在这种情况下,用户提供的密码必须能够被webapp解密,所以它们可以被传递给各种服务进行认证。

我应该如何存储这些密码?

我读过关于在db中存储密码的各种帖子(答案总是'不'),但在这种情况下,我看不到另一种方法。 (虽然欢迎,但建议)

回答

0

让我们在这里澄清:服务器必须能够恢复明文密码。

考虑一些事情你可以做:

  • 加密与密钥密码。将密钥存储在配置文件中。
  • 用智能卡/黑匣子加密密码。
  • 通过发送HTTPS请求,在另一台服务器的帮助下加密/解密密码。
  • 用RAM中的密钥加密密钥。使用mlock()来阻止它被交换到磁盘。希望你不必重新启动。

如果攻击者有根目录(但没有任何内容),它们都不会帮助你。如果攻击者切断电源并窃取数据包,它们大部分都不会帮助你(RAM不像你想要的那样是非易失性的)。

你试图抵御什么攻击?你忽略了什么攻击?

一种可能性是使用从用户密码派生的密钥(如OSX的Keychain和Windows的无人使用的等效密码存储)对密码进行加密。当用户登录到您的Web服务时,您可以将密钥保留在会话中(或使用一次性键盘异或将其存储在cookie中,并且只在用户发送请求时恢复密钥)。这使得从数据库备份中窃取外部密码至少与破解用户密码一样困难。不过,这对其他人来说并没有什么帮助。