SMTP驗證方式種類(LOGIN、PLAIN、CRAM-MD5)

 開通了獨立博客http://www.zhougou.net/ 希望大家多多關注

 

最初的SMTP協議不包含安全認證的,所謂的ESMTP在安全性方面擴展了SMTP,通過增加命令EHLO和AUTH。如今的SMTP服務器,無論是公網的還是內網的,大都要求安全認證,如果你使用的是Outlook Express,那麼在郵箱帳戶的配置中有一個選項-“我的SMTP服務器要求驗證”。我們的應用程序中經常有發送郵件的功能,而簡單的郵件發送程序沒有包含驗證的模塊。

當客戶端發送“EHLO”到Server後,Server將發送一個列表,類似:

EHLO
250-SMTP.Mydomain.com Hello [192.168.0.1]
250-8bitmime
250-BINARYMIME
250-VRFY
250-AUTH LOGIN PLAIN CRAM-MD5
250-AUTH=LOGIN
250 OK

列表中"LOGIN PLAIN CRAM-MD5"說明了該SMTP Server支持的驗證方式,本文將詳細解釋這三種驗證方式。

LOGIN方式

使用login方式的驗證序列如下 (C:表示Client,S:表示Server)
C:auth login ------------------------------------------------- 進行用戶身份認證
S:334 VXNlcm5hbWU6 ----------------------------------- BASE64編碼“Username:”
C:Y29zdGFAYW1heGl0Lm5ldA== ----------------------------------- 用戶名,使用BASE64編碼
S:334 UGFzc3dvcmQ6 -------------------------------------BASE64編碼"Password:"
C:MTk4MjIxNA== ----------------------------------------------- 密碼,使用BASE64編碼
S:235 auth successfully -------------------------------------- 身份認證成功
(Base64 編碼計算:http://tool.114la.com/base64.html )

PLAIN方式
基於明文的SMTP驗證,詳見:
http://www.ietf.org/internet-drafts/draft-ietf-sasl-plain-08.txt
其發送用戶名與口令的格式應該是“<NULL>tim<NULL>tanstaaftanstaaf”。“tim”是用戶名,後邊的字符串是口令,NULL是ASCII的0(所以無法使用telnet登錄)。

CRAM-MD5方式
CRAM-MD5即是一種Keyed-MD5驗證方式,CRAM是“Challenge-Response Authentication Mechanism”的所寫。所謂Keyed-MD5,是將Clieng與Server共享的一個Key作爲一部分MD5的輸入,正好郵件系統的用戶口令可以作爲這個Key。具體的交互如下:

S: * OK IMAP4 Server
C: A0001 AUTHENTICATE CRAM-MD5
S: + PDE4OTYuNjk3MTcwOTUyQHBvc3RvZmZpY2UucmVzdG9uLm1jaS5uZXQ+ -------- Server發送BASE64編碼的Timestamp、Hostname等給Client
C: dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw ------- Client將收到的信息加上用戶名和口令,編碼爲BASE64發送給Server
S: A0001 OK CRAM authentication successful ----------- Server使用該用戶的口令進行MD5運算,如果得到相同的輸出則認證成功

Keyed-MD5的計算公式爲:
MD5 ( (tanstaaftanstaaf XOR opad),MD5((tanstaaftanstaaf XOR ipad), <[email protected]>) ),其中

MD5()爲標準的MD5算法,“tanstaaftanstaaf”爲用戶口令,“<[email protected]>”是從Server發送過來的Timestamp和Hostname等,ipad和opad爲Keyed-MD5算法特定的常數。上面的公式得出的digest爲"b913a602c7eda7a495b4e6e7334d3890",加上用戶名,即"tim b913a602c7eda7a495b4e6e7334d3890"進行BASE64的編碼,得到上面發送給Server的“dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw”。

關於MD5和KeyedMD5的程序代碼可以在各自的RFC中找到,在VC下需要改正幾個編譯錯誤。

MD5 RFC:
http://www.faqs.org/rfcs/rfc1321.html
Keyed-MD5 RFC:http://www.faqs.org/rfcs/rfc2104.html
SMTP驗證:http://www.faqs.org/rfcs/rfc2195.html

SMTP驗證還有GSSAPI、NTLM、Kerberos等,正在學習中,關於Kerberos協議的詳細資料不知道哪裏有比較好的。

http://web.mit.edu/kerberos Kerberos MIT主頁
http://www.cmf.nrl.navy.mil/CCS/people/kenh/kerberos-faq.html FAQ
http://web.mit.edu/kerberos/www/dialogue.html 兩人對話形式的講解,曾被譯成中文沒看懂,英文的看懂了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章