xmpp登录SASL认证流程

  • Tigase提供三种SASL认证机制:SCRAM-SHA-1、PLAIN、ANONYMOUS;

    SCRAM-SHA-1,如果帐号和密码都在Client对象中提供了,这种机制是首选,即使没有TLS加密也是安全的。关于SCRAM-SHA-1加密过程,参考:

      http://www.it1352.com/307661.html
    

    PLAIN,如果SCRAM-SHA-1无效,就使用此种机制。在没有TLS加密时是不安全的。

    ANONYMOUS,此种机制在没有提供帐号和密码时使用。服务器将随机产生临时帐号和资源,提供限制的有效服务。

  • 1、客户端发起流请求

      <?xml version='1.0'?>
      <stream:stream xmlns='jabber:client'         
      xmlns:stream='http://etherx.jabber.org/streams' 
      from='aikucun.com' 
      id='a8a54bd1-bd14-4b6d-9fb2-161ba9617a21' 
      version='1.0' 
      xml:lang='en'>
    
  • 2、服务器响应流

      <stream:features>
          <auth xmlns="http://jabber.org/features/iq-auth"/>
          <register xmlns="http://jabber.org/features/iq-register"/>
          <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
              <mechanism>SCRAM-SHA-1</mechanism>
              <mechanism>PLAIN</mechanism>
              <mechanism>ANONYMOUS</mechanism>
          </mechanisms>
          <ver xmlns="urn:xmpp:features:rosterver"/>
          <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
          <compression xmlns="http://jabber.org/features/compress">
              <method>zlib</method>
          </compression>
      </stream:features>
    
  • 3、客户端发送认证报文,Tigase提供三种SASL认证机制:SCRAM-SHA-1、PLAIN、ANONYMOUS;

    • 3.1 PLAIN

      客户端发送认证报文,用户名和密码按照这种格式组织:

        \0UserName\0Password
      

      例如使用账号aaa密码12345678登录,则使用该格式组织为新的字符串,

        \0aaa\012345678
      

      再进行base64编码,得到字符串“AGFhYQAxMjM0NTY3OA==”,发送的报文如下:

        <auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
         AGFhYQAxMjM0NTY3OA==
        </auth>
      

      服务器返回的成功报文:

        <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
      

      服务器返回的失败报文:

        <failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
      
    • 3.2 SCRAM-SHA-1

      客户端发送认证报文:

        <auth mechanism="SCRAM-SHA-1" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
            biwsbj1hYWEscj03eGR4d1lGaCQiZXkodWJqNjhxI0FgI0RRWCVaIzcjfg==
        </auth>
      

      服务器收到认证请求后返回挑战码:

        <challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
            cj03eGR4d1lGaCQiZXkodWJqNjhxI0FgI0RRWCVaIzcjfjBHWEVtYUExV29uQWlwUkFod3FoLHM9TGhGNHA1V3U0NHpqY3c9PSxpPTQwOTY=
        </challenge>
      

      客户端接收到挑战码后,根据用户输入的密码(原文)按注册用户时保存密码采用Hash算法进行同样的计算,得到与服务后端数据库存储的密码Hash同样的值,再以此为种子对挑战码进行特定算法计算。具体算法可以用对称加密、二次加盐hash等,经过计算后的挑战码作为响应发回给服务端,如下:

        <response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
            Yz1iaXdzLHI9N3hkeHdZRmgkImV5KHViajY4cSNBYCNEUVglWiM3I34wR1hFbWFBMVdvbkFpcFJBaHdxaCxwPTV0UTZCZVdEVkRHd3kvRCtyRGxIWGtBT1JVcz0=
        </response>
      

      服务端根据之前提供的UID获取用户保存的密码hash值,对响应码进行相同的算法计算后与客户端传递的挑战码响应进行碰撞认证,成功返回:

        <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
            dj14NHhDV29SQTc5NzBwTFgrWXh3d0VubElrdDg9
        </success>
      

      认证失败返回:

        <failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
      
    • 3.3 ANONYMOUS

      客户端发送认证报文:

        <auth mechanism="ANONYMOUS" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
            =
        </auth>
      

      服务器直接返回认证成功报文:

        <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
      

版权声明:本文为qq_21998021原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。