3 安全机制
3.1 简单认证和安全层协商机制
简单认证和安全层(Simple Authentication and Security Layer,SASL)可以为基于连接的协议加入认证机制,提供KERBEROS_V4、PLAIN和DIGEST-MD5等多种认证方法。每种认证机制包含认证机制名、认证过程初始化命令、认证控制命令、特定8位码和解释器等信息。
在认证过程中,认证服务器完成认证、授权标识传送、简单认证和安全层协商3个方面的工作。在XMPP中,SASL处理步骤如下(C:客户端,S:SASL认证服务器):
(1)C、S之间建立连接。(2)S向C提供认证机制列表。(3)C在认证机制列表中选择一种认证机制。(4)S向C询问授权信息。(5)C向S提交授权信息。(6)S向C返回认证成功或失败信息。
3.2 回拨认证
在通信过程中,2个XMPP服务器之间经常需要通信,为避免利用服务器欺骗方式进行信息伪造,XMPP 采用了回拨认证机制。回拨认证依靠DNS技术完成,利用回拨认证机制,一个服务器可以确认与自己建立连接的服务器是否经过合法授权,回拨认证过程为:(1)源服务器和接收服务器建立连接,并向接收服务器请求认证。接收服务器回应,并分配认证会话ID。(2)源服务器向接收服务器发送认证密钥。(3)接收服务器与认证服务器建立连接。认证服务器同时为该认证会话分配一个验证会话ID。(4)接收服务器把源服务器提交来的密钥和验证会话ID 发送给认证服务器,请求验证。(5)认证服务器验证密钥,并给接收服务器返回认证结果。(6)接收服务器给源服务器返回认证结果。
3.3 加 密
虽然SASL提供了先进的认证机制,通信双方必须经过特定的授权认证才能进行正常通信,但是登录信息一般都是密码和用户名等重要信息,它们大多采用明文方式传送,因此很容易被窃听。为解决该问题,XMPP采用基于传输层安全协议的“STARTTLS”扩展来为通信双方提供机密性和数据完整性服务。TLS 协议包括两个协议组―― TLS 记录协议和 TLS 握手协议――每组具有很多不同格式的信息。TLS 记录协议是一种分层协议。每一层中的信息可能包含长度、描述和内容等字段。记录协议支持信息传输、将数据分段到可处理块、压缩数据、应用 MAC 、加密以及传输结果等。对接收到的数据进行解密、校验、解压缩、重组等,然后将它们传送到高层客户机。TLS 连接状态指的是TLS 记录协议的操作环境。它规定了压缩算法、加密算法和 MAC 算法。TLS 记录层从高层接收任意大小无空块的连续数据。密钥计算:记录协议通过算法从握手协议提供的安全参数中产生密钥、 IV 和 MAC 密钥。TLS 握手协议由三个子协议组构成,允许对等双方在记录层的安全参数上达成一致、自我认证、例示协商安全参数、互相报告出错条件。
TLS协议框架主要有2个层次的协议:TLS握手协议和TLS记录协议。TLS握手协议用来让服务器与客户在传输应用层数据之前交换TLS协议版本信息、协商加密算法、进行(相互)身份认证并交换密钥。TLS记录协议用来将应用层提供的信息进行分组、压缩、数据完整性检查和加密。数据完整性检查通过比较传输前后使用安全散列函数(如SHA和MD5 等)计算出来的数据的MAC值是否一致来完成。数据加密采用对称密码算法(如R4和DES等)。对数据进行完整性检查和加密的密钥由TLS握手协议来协商。
XMPP中采用的STARTTLS扩展处理流程如下(C:客户端,S:TLS服务器):
(1)C、S之间建立XML流会话连接。
(2)S 向C 发送STARTTLS扩展服务需求及支持的其他认证机制列表,代码实例如下:
(3)C发送STARTTLS命令给S。
(4)C、S中TLS握手协议开始协商相关加密算法及密钥。
(5)若TLS握手协议协商成功,则关闭当前XML流会话,C发起一个新的XML流会话,所有传送的信息均被TLS记录协议加密。TLS握手协议协商不成功则发出警告信息。
(6)S向C回复新XML流会话。
4 客户端程序设计中的关键问题
由于网络中已存在大量的XMPP服务器,在一般的应用开发中,只要设计自定功能的客户端程序即可,并可以选用Smack库来加速开发。
(1)创建一个XMPP连接。因为XMPP使用TCP协议,所以首先必须创建一个网络连接,XMPPConnection就是Smack库用来创建与XMPP服务器连接的类,创建一个XMPP连接的代码如下:
XMPPConnection connection=new XMPPConnection(″jab-
ber.org″);
如要创建加密连接,可以使用SSLXMPPConnection类:
XMPPConnection connection=new SSLXMPPConnection(″jabber.org″);
(2)登录。TCP连接创建后,需要使用用户名和密码登录到XMPP服务器,登录程序可以使用XMPPConnection.login(String username,String password)方法。登录后就可以和其他人聊天。
connection.login(″yb″,″password″);//connection为已创建的XMPP连接,下同
connection.createChat(″yb@sdpt.com″)。sendMessage
(″Hello!″);
(3)操作名册。每个用户都包括:一个XMPP地址(如mailto:%E2%80%9Cyb@sdpt.com”)、名称或昵称(如″yb″),及其所属列表(如好友、同事等)。名册能够跟踪好友或某用户组是否在线及其状态信息,登录后,可以使用Roster类来取得好友或某用户组的状态,代码如下:
Roster roster=con.getRoster( );
for (Iterator i=roster.getEntries( );i.hasNext( ); ) {
System.out.println(i.next( ));}
名册信息通常是随时变化的,可能需要增加或删除。要监听名单及其在线状态的改变,可以使用RosterListener。
(4)发送和接收消息。发送接收消息可以使用Chat和GroupChat类。下面介绍如何使用Chat发送文本消息,GroupChat的使用方法类似。
Chat newChat=connection.createChat(″yb@sdpt.com″);//创建新Chat
newChat.sendMessage(″Hello!″);//发送消息″Hello!″
利用Chat.sendMessage( )方法可以方便地创建一个消息对象,它的参数就是消息内容,执行后消息会发送出去。
Chat newChat=connection.createChat(″yb@sdpt.com″);
newMessage.setBody(″Hi, I′m waiting for you.″);
while (true) {
Message message=newChat.nextMessage( );//等待对方发送消息
newChat.sendMessage(message.getBody());//把对方
}//发送来的消息发回去
(5)修改状态。要修改状态可以用presence.Type.UNAV-ILABLE作为参数创建一个presence,状态将改变为不在线状态。
Presence presence=new Presence(Presence.Type.UNAVAILABLE);
presence.setStatus(″Gone skating″);
5 结束语
目前,全球有20万个即时通信平台支持XMPP,有1 000万人在使用。简单的接口、开放的协议、互联的架构、权威的标准再加上坚实的用户基础是XMPP的优势。
评论
查看更多