imap_open,带有来自数据库的加密密码

时间:2014-04-26 21:50:48

标签: php imap imap-open

我正在为我正在工作的公司开发一个管理面板,并对此感到疑惑。我想增加员工的经验。我希望他们能够通过输入登录凭据连接到他们的电子邮件,然后阅读管理面板内的电子邮件。我需要帮助的是:

如果我建立了一个imap_open连接,我需要明文密码(据我所知)。我无法安全地将密码保存在数据库中,因为如果黑客掌握了数据,这将是一场灾难。

基本上,我想:

  • 使用 ENCRYPTED 密码创建imap_open连接。最好是bcrypt。

你们中的任何人都知道怎么做吗?我在google上搜索过,甚至在stackoverflow上看过其他一些问题,但我似乎找不到问题的答案。我绝不会将密码保存为纯文本。只是使用COOKIE或SESSION似乎很麻烦..管理员一直登录他们的电子邮件,当我想要的是在登录时为相应的管理员帐户加载电子邮件。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,你想:

  • 将用户密码安全地存储在他们的计算机上
  • 使用它连接到邮件服务器
  • 下载电子邮件

以明文形式存储用户密码显然是禁忌。有不同的方法可以解决这个问题。该应用程序实际上可以从用户请求密码,这是一个简单但不太方便的解决方案。

通常使用单向哈希方案(如SHA256或bcrypt)存储密码,但这意味着您只能检查密码是否与它们匹配;您无法检索密码并将其发送到其他地方。所以你必须转向对称密钥加密。 您将加密密码存储在某个地方(在数据库中),并在需要时将其检索,解密并通过IMAP连接发送。加密问题在于它依赖于密钥,可能会在某些时候受到损害,但如果您需要检索它,则无法进行散列。

另外需要注意的是以明文形式发送密码的风险。如果您的服务器使用SSL,则需要注意这一点。

答案 1 :(得分:-1)

是的,当然AUTHENTICATE PLAIN会对密码进行编码。但是,支持管理员访问权限的服务器允许您对管理员的密码以及用户的名称进行编码,以便您可以访问该用户的帐户。

$login_str = sprintf("%s\x00%s\x00%s", $user_name,$admin_name,$admin_pwd);

$login_str = encode_base64("$login_str", "");

当您在AUTHENTICATE PLAIN登录中使用已编码的字符串时,您可以访问该用户的帐户。而且您不需要用户的密码。

如果您使用AUTH PLAIN ...

执行此操作
sprintf("%s\x00%s\x00%s", $user_name,$user_name,$user_pwd);

然后您就可以访问该用户的帐户。但是提供管理员凭证似乎可以做OP想要做的事情而不存储密码。

答案 2 :(得分:-2)

如果您的IMAP服务器支持通过AUTHENTICATE PLAIN进行管理员登录,那么您不需要用户的密码来访问其邮箱。

许多IMAP服务器支持这一点,例如Dovecot,CommuniGate,Zimbra,以此命名三个。