19

我需要存储密码并再次使用它。我认为这根本不安全。

设想:

我想创建一个网络邮件程序,用户使用用户名和密码登录,然后检查他们的电子邮件。此工具不打算在 db 上存储密码。但是在 PHP 中,我们需要在用户导航到的每个页面中连接到邮件服务器。所以需要用户名和密码才能连接到邮件服务器。如何以最安全的方式做到这一点?

4

1 回答 1

25

由于不打算存储密码,而且必须多次重新输入密码也是不可取的,我看到的唯一解决方案是:

  • 使用足够长的随机密钥加密密码(例如使用 AES)
  • 在会话中存储加密的密码和用户名
  • 以防万一,加密用户名和邮件服务器也可能没有错误。它不会受到伤害,并且假定的攻击者在服务器上没有已知的用户名。
  • 将加密密钥存储在 cookie 中

这并不完美,但它应该工作得相当好,而且它可能是你能得到的最好的权衡。

对于每个请求,用户的浏览器都会发送 cookie,PHP 脚本可以使用 cookie 来解密存储在会话中的数据并在 IMAP/POP 服务器上发出请求。

有人利用您的服务器并获得对会话存储的访问权限将能够窃取加密密码,但如果您的随机密钥足够长且随机质量良好,那么这是徒劳的。

关键是,你只能用你不知道的秘密来真正保护一些东西。如果您有必要的信息来解密服务器上的某些信息(在这种情况下为 IMAP 密码),例如在会话存储中,那么利用您服务器的每个人都可以这样做。无论您的加密有多强大,它都没有任何区别。
确保秘密保持秘密的唯一方法是用你不知道的东西加密它们,只有用户(或者在这种情况下是用户的浏览器)知道的东西。

这导致了一个无法解决的问题,在某个时间点,你显然必须知道,至少在几分之一秒内。这是从 Web 服务器接收 cookie 到 PHP 脚本退出之间的时间。理论上,如果有root权限的人在那段时间读取进程内存,他也会知道这个秘密。但是,唉,这是你真的无法阻止的事情。
不过,只要信息从未存储在任何地方(甚至在会话中),它就应该是相当安全的。

当然,所有这些都假设至少您网站上的登录页面(最好是全部)是通过 提供https://的,并且您使用 TLS/SSL 与邮件服务器进行通信。否则,您将面临更多微不足道的攻击。

于 2013-01-12T14:05:57.197 回答