利用SMTP發送Mail詳解(二)

3. SMTP身份認證
SMTP身份認證方式有很多種, 每種認證方式驗證發送的信息都有點細微的差別, 這裏我主要介紹下LOGIN,PLAIN及NTLM三種簡單的認證方式, 附帶CRAM-MD5和DIGEST-MD5方式(驗證沒通過, 不知道問題出在哪了? 有待高人幫忙解決!).

要進行身份認證, 先要知道當前SMTP服務器支持哪些認證方式, 在ESMTP中有個與HELO命令相同功能的命令EHLO可以得到當前服務器支持的認證方式(有些服務器無返回信息, 可能服務器端作了限制).
 

1) LOGIN認證方式
LOGIN認證方式是基於明文傳輸的, 因此沒什麼安全性可言, 如信息被截獲, 那麼用戶名和密碼也就泄露了. 認證過程如下:
AUTH LOGIN
334 VXNlcm5hbWU6                            //服務器返回信息, Base64編碼的Username:
bXlOYW1l                                //輸入用戶名, 也需Base64編碼
334 UGFzc3dvcmQ6                            //服務器返回信息, Base64編碼的Password::
bXlQYXNzd29yZA==                            //輸入密碼, 也需Base64編碼
235 2.0.0 OK Authenticated                        // 535 5.7.0 authentication failed

2). NTLM認證方式
NTLM認證方式過程與LOGIN認證方式是一模一樣的, 只需將AUTH LOGN改成AUTH NTLM.就行了.

3). PLAIN認證方式
PLAIN認證方式消息過過程與LOGIN和NTLM有所不同, 其格式爲: “NULL+UserName+NULL+Password”, 其中NULL爲C語言中的’/0’, 不方便使用命令行測試, 因此下面給出C++代碼來實現:
char szSend[] = "$user$pwd";
size_t n = stlen(szSend);
for(int i=0; i<n; i++)
    if(szSend[i] == '$') szSend[i] = '/0';

char szMsg[512]
base64_encode(szSend, n, szMsg);
send (skt, szMsg, strlen(szMsg), 0);

4). CRAM-MD5認證方式
前面所介紹的三種方式, 都是將用戶名和密碼經過BASE64編碼後直接發送到服務器端的, BASE64編碼並不是一種安全的加密算法, 其所有信息都可能通過反編碼, 沒有什麼安全性可言. 而CRAM-MD5方式與前三種不同, 它是基於Challenge/Response的方式, 其中Challenge是由服務器產生的, 每次連接產生的Challenge都不同, 而Response是由用戶名,密碼,Challenge組合而成的, 具體格式如下:
response=base64_encode(username : H_MAC(challenge, password))
H_MAC是Keyed MD5算法(見http://www.faqs.org/rfcs/rfc2195.html), 先由challenge和password生成16位的散列碼, 將其轉換成16進制32個字節的字符串數組digest(即以%02x輸出), 再對(username+空格+digest[32])進行base64編碼,就是要發送的response了.
另外, 在http://www.net-track.ch/opensource/cmd5/提供了SMTP CRAM-MD5認證源碼, 可用於測試CRAM-MD5認證, 但不知道是不是我這邊測試的SendMail服務器配置有問題, 測試時一直不能通過.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章