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

2022-08-30 21:09:39

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

场景:

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


答案 1

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

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

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

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

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

关键是,你只能用一个你不知道的秘密来真正保护一些东西。如果您拥有解密服务器上某些信息(在本例中为 IMAP 密码)的必要信息(例如在会话存储中),则利用您服务器的每个人都可以执行相同的操作。无论您的加密有多强,它都不会有任何区别。
确保机密保持机密的唯一方法是使用您不知道的内容对其进行加密,这些内容只有用户(在本例中为用户的浏览器)知道。

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

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


答案 2

推荐