想过成功,也想过失败。但从未想过放弃……

ESMTP的三个认证方式: CRAM-MD5 PLAIN和LOGIN

上一篇 / 下一篇  2009-11-26 21:53:16 / 个人分类:基础知识

ESMTP的三个认证方式: CRAM-MD5 PLAIN和LOGIN. 下面对这三种认证方式的流程进行一个总结.

CRAM-MD5:
客户端首先向服务器端发送一个字符串: "AUTH[SPACE]CRAM-MD5[CRLF]".其中[SPACE]表示一个空格;[CRLF]表示回车换行符, 即"\r\n". 下同.
如果服务器拒绝认证方式, 则返回一个字符串: "[NUM][SPACE]str". 其中[NUM]为三位数字的服务器状态码( 下同 ).当状态码不等于334表示拒绝认证方式. str是一个服务器端定义的字符串, 用于描述错误.
如果服务器接受认证方式, 则返回一个字符串: "[NUM][SPACE]str_base64".其中str_base64是一个随机字符串经过base64编码后的字符串.
客户端收到服务器的信息后, 执行如下操作:
首先利用base64解码算法将str_base64解码. 解码后的字符串存入str
 *      call base64_decode
 *      input str_base64
 *      output str

之后利用hmac-md5算法计算出一个摘要digest
 *      call hmac_md5
 *      input password, str
 *      output digest

将摘要用小写字母的16进制表示, 并把字符串"username "与它合并, 成为字符串tmp
 *      string tmp = 'username digest'

将tmp进行base64编码
 *      call base64_encode
 *      input tmp
 *      output tmp_base64
最后, 客户端向服务器端发送字符串: "tmp_base64[CRLF]"
根据服务器的返回判断是否认证成功

PLAIN:
客户端首先做如下操作:
 *      string tmp = '^username^password'
 *      for each character in tmp
 *        tmp[i] = '\0' where tmp[i] == '^'
 *      call base64_encode
 *      input tmp
 *      output tmp_base64
最后, 客户端向服务器端发送字符串: "tmp_base64[CRLF]"
根据服务器的返回判断是否认证成功

LOGIN:
客户端首先向服务器端发送一个字符串: "AUTH[SPACE]LOGIN[CRLF].
如果服务器拒绝认证方式, 则返回一个字符串: "[NUM][SPACE]str". 其中[NUM]不等于334, 表示拒绝认证方式. str是一个服务器端定义的字符串, 用于描述错误.
如果服务器接受认证方式, 则返回一个字符串: "[NUM][SPACE]user_base64". 其中user_base64是一个利用base64编码后的字符串
客户端收到服务器信息后做如下操作:
 *      call base64_decode
 *      input user_base64
 *      output tmp
此处仅仅对服务器返回的字符串做合法性检测. 之后的认证过程中不会用到它

 *      call base64_encode
 *      input username
 *      output username_base64
接着, 客户端向服务器发送一个字符串: "username_base64"
服务器返回一个字符串:"[NUM][SPACE]pass_base64".其中pass_base64是一个利用base64编码后的字符串
客户端收到服务器信息后做如下操作:
 *      call base64_decode
 *      input pass_base64
 *      output tmp
此处也仅对服务器返回的字符串做合法性检测. 之后的认证过程中不会用到它

 *      call base64_encode
 *      input password
 *      output password_base64
最后, 客户端向服务器发送一个字符串: "password_base64"
根据服务器的返回判断是否认证成功

本文粗略介绍了ESMTP的认证方式. 
所提到的三种认证方式中, CRAM-MD5的安全性最强. 而其他两种认证方式个人认为与明文传输几乎没有区别. 因为base64本身就不是一个用于加密的算法.如果采用后两者的认证方式, 任何一个攻击者都可以轻易地通过简单的嗅探获得客户端与服务器端的通信, 最终获得用户的登录名和密码.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/monnand/archive/2006/08/17/1076581.aspx

使用smtp.163.com或smtp.qq.com时,若使用LOGIN认证,则都可以实现,用另二种时则都会出来认证失败的错误。如下图所示
smtp.163.com:
  PLAIN

CRAM-MD5

smtp.qq.com:
PLAIN

CRAM-MD5


从以上图可能分析出:
一、163还用SMTP协议,而QQ用ESMTP协议。
二、163与QQ只提供LOGIN认证给我们用,其他认证未开放给用户。所以若用其他认证时,发送会失败


TAG:

 

评分:0

我来说两句

日历

« 2024-05-09  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 28901
  • 日志数: 40
  • 建立时间: 2008-11-24
  • 更新时间: 2010-05-20

RSS订阅

Open Toolbar