密码加密,在会话中存储密码

时间:2013-01-12 13:35:32

标签: php security email session passwords

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

情境:

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

1 个答案:

答案 0 :(得分:23)

由于存储密码并非意图,但也不需要多次重新输入密码,我看到的唯一解决方案是:

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

这不是完美的,但它应该运作得相当好,而且可能与你能得到的权衡一样好。

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

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

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

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

当然所有这一切都假设至少您网站上的登录页面(最好全部)是通过https://提供的,并且您使用TLS / SSL与邮件服务器进行通信。否则,你会受到更多琐碎的攻击。<​​/ p>