php - 密码加密,在 session 中存储密码

标签 php security email session passwords

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

场景:

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

最佳答案

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

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

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

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

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

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

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

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

关于php - 密码加密,在 session 中存储密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14293815/

相关文章:

php - 使用 Zend_Mail 时如何验证邮件是否已发送?

php - 如何在 oracle 数据库中正确显示日文字符

javascript - PHP if 语句基于屏幕尺寸

php - 你能看到 PHP 脚本客户端吗?

javascript - 如何检测是否在我的页面中注入(inject)了不需要的 chrome 内容脚本?

delphi - 将邮件项目从一个文件夹移动到另一文件夹

php - 从数据库php mysql搜索日期范围

java - 在 Veracode 中使用 slf4j LOGGER 时出现 CRLF 注入(inject)漏洞 (CWE 117)

Linux 邮件命令文件附件

php - 向多个收件人发送电子邮件 - 抄送 : and Bcc: in php