2012-08-17 39 views
1

我有一个应用程序已经构建和运行的auth层。我希望在此应用程序中添加一个小型的imap客户端,但不知道如何处理imap auth。我一直在构建认证系统来加密/散列密码,然后立即销毁纯文本密码的任何痕迹......所以,我从来没有处理过需要维护的密码的经验。PHP Imap验证其他会话

我希望用户能够从应用程序内(或初次登录时)登录imap,并在使用应用程序的其他功能时保持该登录。

任何提示将是伟大的...谢谢。

回答

1

不幸的是,IMAP协议要求您知道密码(共享密钥)以便能够使用它进行身份验证。当你登录到IMAP时,你可以直接使用它,或者使用类似CRAM-MD5的东西。

但是,根据服务器的不同,通常可以通过至少每30分钟发出一次NOOP来无限期地维护IMAP连接。但是,任何网络问题都需要您再次登录。

+0

感谢您的回复。所以基本上我需要保持一个纯文本密码存储在会话变量,如果我想保持它“登录”?你能为我提供有关NOOP的更多信息吗? – 2012-08-17 21:00:24

+0

NOOP实质上只是一个IMAP命令,表示您不想执行任何操作(无操作),但会告诉服务器您仍然在那里,并且可以发送它所具有的任何更新。但是,不幸的是,您确实需要在某处存储密码。 – Max 2012-08-18 01:02:37

+0

谢谢。有关如何安全地存储密码的任何建议?就像我刚才提到的那样,这个想法直到现在从未想过。像RoundCube这样的软件包如何处理它? – 2012-08-18 16:29:07

4

有关信息,我检查了roundcube代码,然后...

Roundcube在会议只是encrypt the password and stores it

$_SESSION['user_id']  = $user->ID; 
$_SESSION['username']  = $user->data['username']; 
$_SESSION['storage_host'] = $host; 
$_SESSION['storage_port'] = $port; 
$_SESSION['storage_ssl'] = $ssl; 
$_SESSION['password']  = $this->encrypt($pass); 
$_SESSION['login_time'] = time(); 

$this->encrypt($pass)rcube::encrypt它使用mcrypt的申请一个3DES加密

然后它使用对称rcube::decrypt方法when needed

$host = $_SESSION['storage_host']; 
$user = $_SESSION['username']; 
$port = $_SESSION['storage_port']; 
$ssl = $_SESSION['storage_ssl']; 
$pass = $this->decrypt($_SESSION['password']); 

顺便说一句,加密方法似乎利用秘密盐(在这里称为“crypto_key”)。

+0

谢谢!这是非常好的信息。 – 2013-09-18 03:37:45