ESMTP身份验证机制探索手记
为了限制非本系统的正式用户利用邮件服务器散发垃圾邮件或进行其他不当行为,国内各大免费/收费邮箱提供商纷纷升级到ESMTP方式,开设了安全认证服务。在ESMTP服务器上,发送邮件需要对用户的身份进行验证。与传统的SMTP方式相比,多了一道用户身份的验证手续,验证之后的邮件发送过程与传统的SMTP方式一致。
几乎所有的ESMTP服务器都继承了POP3服务器的账号和密码设置体系,也就是说收发邮件用相同的账号和密码。当然,也可以用不同的账号和密码,但那样无论是电子邮件服务提供商的维护还是用户的使用都会很麻烦,故而很少采用。
ESMTP身份验证的机制有很多种,最常见的是LOGIN机制,类似于POP3的身份验证方式,即分两步输入账号和密码。在所有的验证机制中,信息全部采用Base64编码。
例如,用smtp.elong.com邮件服务器发送邮件,从开始连接到身份验证的过程如下(红色和蓝色分别代表客户端和服务器):
(连接到smtp.elong.com:25) 220 sp1 ESMTP v2.1 EHLO ABCDEFG 250-smtp.elong.com 250-PIPELINING 250-SIZE 20480000 250-ETRN 250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5 (支持的身份验证机制种类: LOGIN, PLAIN等) 250 8BITMIME AUTH LOGIN 334 VXNlcm5hbWU6 (Base64解码后: Username:) Ymh3YW5n (Base64编码前: bhwang) 334 UGFzc3dvcmQ6 (Base64解码后: Password:) bXlwYXNzd29yZCFteXBhc3N3b3JkISE= (Base64编码前: ********) 235 Authentication successful另外一种较常见的机制是PLAIN。与LOGIN机制的不同之处在于一次性输入账号和密码,格式为“<NUL>账号<NUL>密码”,其中<NUL>为字节0。用PLAIN机制代替上面的身份验证过程:
AUTH PLAIN 334 AGJod2FuZwBteXBhc3N3b3JkIW15cGFzc3dvcmQhIQ== (Base64编码前: <NUL>bhwang<NUL>********) 235 Authentication successful有的ESMTP服务器,例如采用CoreMail系统的smtp.163.com, smtp.163.net, smtp.tom.com, smtp.netease.com等,不回复334代码行,客户端在输入AUTH PLAIN后,直接输入符合格式要求的账号和密码即可。
LOGIN和PLAIN机制没有对账号和密码进行加密,相当于明文传输,Base64编码只是一层纸而已。DIGEST-MD5, CRAM-MD5, GSSAPI, KERBEROS_V4等身份验证机制能够加密传输内容。
以CRAM-MD5为例,身份验证过程为:
a. 客户端声明用CRAM-MD5验证方式
b. 服务器提供一个标记(戳)
c. 客户端用邮箱密码做密钥,以MD5方式加密此标记,生成HMAC;然后将用户名连同HMAC发送出去
d. 服务器收到用户名与HMAC,检验其正确性,给出回复
AUTH CRAM-MD5 334 PDExMjc5NDA4MTYuMTgwMDM5NEBzbXRwLmVsb25nLmNvbT4= (Base64解码后: <1127940816.1800394@smtp.elong.com>) Ymh3YW5nIDVmZWIwYzcxMWVlMGQzYWU1ZTNlYjA4N2VhMGU2YTI3 (Base64编码前: bhwang 5feb0c711ee0d3ae5e3eb087ea0e6a27) 235 Authentication successful其中,“5feb0c711ee0d3ae5e3eb087ea0e6a27”是用“<1127940816.1800394@smtp.elong.com>”与邮箱密码进行MD5运算得到的HMAC。具体算法可参考RFC 1321, RFC 2104等。
[相关资源]
首次发布: 2003-07-22
最后修订: 2003-07-22
- · 软件解密技术研究
- · “瑜珈山夜话”--- 参考资料
- · 写扫雷的一点感想(初学的朋友可以看看)
- · 运用VC或Java对Office进行编程操作
- · 可以动态读入系统所支持的数据库
- · 向你的程序中添加多语言支持
- · 计算24点
- · DSP应用实例(一)--轻松实现BT多点下载
- · DirectShow应用程序设计介绍(翻译)
- · 一个俄罗斯方块游戏源程序
- · 数据结构学习(C++)——二叉树【1】
- · 闲侃名家名作
- · 在编程中调用OLEDB的数据连接属性对话框
- · JIURL玩玩Win2k内存篇 Page Frame Number Database
- · JIURL玩玩Win2k内存篇 LookasideList
- · JIURL玩玩Win2k内存篇 内存共享(一) ProtoPTE
- · JIURL玩玩Win2k内存篇 内存共享(二) CopyOnWrite
- · JIURL玩玩Win2k 对象
- · JIURL玩玩Win2k进程线程篇 EPROCESS
- · JIURL玩玩Win2k进程线程篇 PEB
- · JIURL玩玩Win2k进程线程篇 HANDLE_TABLE
- · JIURL玩玩Win2k进程线程篇 ETHREAD
- · JIURL玩玩Win2k进程线程篇 TEB
- · JIURL玩玩Win2k 地址空间的布局
- · JIURL玩玩Win2k 参考资料
- · 小议static
- · 流媒体学习笔记----用配置好的文件进行编码
- · 流媒体学习---------序
- · 这两年的感悟与经历
- · 数据结构学习(C++)——二叉树【2】
- · 关于 Service 设计初步(MSDN节选翻译)
- · 数据结构学习(C++)——二叉树【3】
- · MinUnit – 最小的c语言测试模板
- · JIURL玩玩Win2k内存篇 分页机制 (一)
- · JIURL玩玩Win2k内存篇 分页机制 (二)
- · JIURL玩玩Win2k内存篇 分页机制 (三)
- · JIURL玩玩Win2k内存篇 分页机制 (四)
- · XML文件源码察看器(六)
