SMTP(Login,Plain,CRAM-MD5)验证
来源:互联网 发布:淘宝网充值平台网址 编辑:程序博客网 时间:2024/05/21 10:11
最初的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 ------------------------------ 身份认证成功
PLAIN方式
基于明文的SMTP验证,其发送用户名与口令的格式应该是“<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”。
关于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等。
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 两人对话形式的讲解
BTW:可以使用telnet连接到Mail Server,方便地查看服务器的响应,然后再编程实现。如:Telnet 127.0.0.1 25。
当客户端发送“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 ------------------------------ 身份认证成功
PLAIN方式
基于明文的SMTP验证,其发送用户名与口令的格式应该是“<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”。
关于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等。
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 两人对话形式的讲解
BTW:可以使用telnet连接到Mail Server,方便地查看服务器的响应,然后再编程实现。如:Telnet 127.0.0.1 25。
0 0
- SMTP(Login,Plain,CRAM-MD5)验证
- SMTP验证方式种类(LOGIN、PLAIN、CRAM-MD5)
- SMTP验证方式种类(LOGIN、PLAIN、CRAM-MD5)
- SMTP身份验证(LOGIN、PLAIN、CRAM-MD5)
- QQ企业邮箱使用Java代码发送失败,错误DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NT
- login验证
- SMTP验证
- (struts2验证码)login.jsp
- LOGIN前端验证
- LOGIN后台验证
- md5验证
- MD5验证
- MD5验证
- Ubuntu smtp验证配置
- 利用SMTP发送验证验证
- 网络MD5加密验证(Java)
- 签名验证使用示例(MD5)
- Jarvis OJ Login【MD5拼接php字符串】
- SQLite数据库文件格式逐字节详解
- 关于利用高德地图API定位所在城市的一切知识点整理
- MyNetCtoss_Struts2项目实施总结文档
- 反转链表(递归)
- CSS Float布局过程
- SMTP(Login,Plain,CRAM-MD5)验证
- 【算法设计】——最长公共子序列
- Unsafe与CAS
- Java Web day(4)之Servlet详解
- 1161
- uboot_编译过程_2
- 汇编学习记录2
- Ajax和Comet
- .mat 与 .txt 文件相互转换的方法