SMTP认证

一、关于SMTP 


  一般电子邮件系统支持两个传输协议: 

  第一个叫做POP3(Post Office Protocol 3),POP3是关于接收电子邮件的协议,它是一个客户/服务器协议,在其中电子邮件由服务器接收并保存,在一定时间之后,客户电子邮件接收程序检查邮箱并下传邮件。 

  第二个协议就是SMTP,就是Simple Mail Transfer Protocol,即简单信件传输协议。它是发送电子邮件的通讯协议, 电子邮件程序也在使用者端使用SMTP来发送邮件给服务器。 

  在邮件客户端软件中,通常我们配置POP3时要求输入口令,但SMTP却无此需要。这就表明,我们无须拥有任何信箱就可以给他人发送信件。 

  也许你会有疑问:如果没有信箱那该如何在邮件客户端软件中进行配置呢?很简单,我们完全可以杜撰一个并不存在的信箱,至于POP3与其口令么,随便输入一个就可以了,因为你根本不会执行收信操作,也不指望能从这个杜撰的信箱中收到信件。而先前免费邮局的SMTP服务器地址又是公开的、无须认证的,这就为垃圾邮件打开了方便之门。任何一个别有用心者只要填入任意一个免费电子邮局的STMP地址,然后就可以借用任何人的名义,甚至是你自己的名义向你恶意发送垃圾邮件了。这也就是很多朋友打开信箱,赫然发现自己收到了“自己”发来的垃圾邮件的缘故。 

  大量垃圾邮件令我们防不胜防,只有通过过滤主题或邮件地址的方法进行堵截。然而这种方法并不见得有效,因为垃圾邮件制造者只须更换一下邮件地址与主题,过滤功能对此束手无策,起不到任何过滤作用了。 

  然而这只是一种被动的防御之法,真正能够治本的方法就是认证SMTP服务器,简单一点来说就是必须像POP3那样,只有拥有了帐户名和密码之后才能发送电邮,这样就会使得那些垃圾邮件制造者无机可乘。 

二、SMTP认证原理过程


  目前流行的邮件客户端程序有Foxmail、Outlook Express等等,在此我们就两种主流程序讲解一下该如何设置SMTP认证。 

  需要注意的是,因各大免费电子邮局基本上都增加了SMTP认证功能,所以如果不进行相关的设置,你可以正常接收邮件,但不能发送邮件! 

  某些客户端程序的先前版本不支持SMTP认证,所以一定要下载程序的最新版本,否则会因无法设置而造成无法发送邮件。
 
 
SMTP验证
最初的SMTP协议是不包含安全认证的,所谓的ESMTP在安全性方面扩展了SMTP,通过增加命令EHLOAUTH。如今的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验证,详见: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”。

关于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 两人对话形式的讲解,曾被译成中文没看懂,英文的看懂了 [lol] 

BTW:可以使用telnet连接到Mail Server,方便地查看服务器的响应,然后再编程实现。如:Telnet 127.0.0.1 25。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值