• [转]ESMTP的三个认证方式: CRAMMD5 PLAIN和LOGIN


    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认证给我们用,其他认证未开放给用户。所以若用其他认证时,发送会失败

    作者:chhuic

    出处:http://chhuic.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    20181123(编码问题)
    20181122笔记(列表、元组、字典和集合的数据类型及内置方法)
    20181121笔记(for,数字类型和字符串类型的内置方法)
    20181120笔记
    Python的第3堂课
    错误集合(想起来就更新)
    Python的第二堂课(2)
    Python的第二堂课(1)
    boost::bind实践2——来自《Beyond the C++ Standard Library ( An Introduction to Boost )》
    boost::bind实践
  • 原文地址:https://www.cnblogs.com/chhuic/p/1579538.html
Copyright © 2020-2023  润新知