2012-08-17 42 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