您的位置:首页 > 大数据 > 人工智能

SMTP身份验证(LOGIN、PLAIN、CRAM-MD5)

2015-05-26 14:01 169 查看
最初的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), <1896.697170952@postoffice.reston.mci.net>) ),其中

MD5()为标准的MD5算法,“tanstaaftanstaaf”为用户口令,“<1896.697170952@postoffice.reston.mci.net>”是从Server发送过来的Timestamp和Hostname等,ipad和opad为Keyed-MD5算法特定的常数。上面的公式得出的digest为"b913a602c7eda7a495b4e6e7334d3890",加上用户名,即"tim b913a602c7eda7a495b4e6e7334d3890"进行BASE64的编码,得到上面发送给Server的“dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: