关于php:密码加密,在会话中存储密码

Password Encryption , storing password in session

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

脚本:

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


由于不打算存储密码,但也不希望多次重新输入密码,因此我看到的唯一解决方案是:

  • 用足够长的随机密钥加密密码(如aes)
  • 在会话中存储加密的密码和用户名
  • 为了以防万一,对用户名和邮件服务器进行加密也可能是正确的。它不会造成伤害,并且假定攻击者在服务器上没有已知的用户名。
  • 将加密密钥存储在cookie中

这不是完美的,但它应该能很好地工作,而且它可能是一个很好的折衷办法。

对于每个请求,用户的浏览器将发送cookie,php脚本可以使用cookie解密会话中存储的数据,并在imap/pop服务器上执行请求。

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

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

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

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