XMPP(Extensible Messaging and Presence Protocol)是一个应用于实时通信的开放协议,定义了有关即时消息通信的各方面内容,本文主要是关于XMPP安全机制的介绍以及设计实现思考。
XMPP包含一个保证流安全的方法来防止篡改和偷听,包括两个层次的安全机制,分别是TLS(Tansport Layer Security)和 SASL(Simple Authentication Security Layer)。
TLS主要用于保证传输通道安全,SASL用于用户鉴权认证,协商流程如下:
1. 客户端发起,流初始化(建立TCP连接,发送如下格式数据)
<stream:stream
from='juliet@im.example.com'
to='im.example.com'
version='1.0'
xml:lang='en'
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'>
2. 服务端应答流初始化
<stream:stream
from='im.example.com'
id='t7AMCin9zjMNwQKDnplntZPIDEI='
to='juliet@im.example.com'
version='1.0'
xml:lang='en'
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'>
3. 服务端发送TLS流特征说明
<stream:features>
<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'>
<required/>
</starttls>
</stream:features>
4. 客户端发起TLS握手
<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
5. 服务端应答
-- 握手成功,继续
<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
-- 握手失败,结束流,关闭TCP连接
<failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
</stream:stream>
6. 握手成功后,客户端重新初始化加密流,并采用安全加密传输(通常由SSL实现),注意:这一步之后的交互数据全部经过加密传输TLS协商完成。
<stream:stream
from='juliet@im.example.com'
to='im.example.com'
version='1.0'
xml:lang='en'
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'>
7. 服务端应答加密流初始化
<stream:stream
from='im.example.com'
id='vgKi/bkYME8OAj4rlXMkpucAqe4='
to='juliet@im.example.com'
version='1.0'
xml:lang='en'
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'>
8.服务端发送SASL特征说明,mechanism指出了服务端支持的认证机制,有关SASL认证的机制可参考RFC4422<stream:features>
<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
<mechanism>EXTERNAL</mechanism>
<mechanism>SCRAM-SHA-1-PLUS</mechanism>
<mechanism>SCRAM-SHA-1</mechanism>
<mechanism>PLAIN</mechanism>
</mechanisms>
</stream:features>
9. 客户端选择认证机制
<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>AGp1bGlldAByMG0zMG15cjBtMzA=</auth>
以下认证过程根据选择的认证机制有所不同,实践中真正的实现一般就具体采用一种认证,依赖具体的用户权限系统进行设计。
这里说说其中一种常见Challenge-Response认证机制
客户端在发送<auth>请求认证时,如上xml片段所示,<auth>元素中包含了一段BASE64编码的字符串,可以是用户ID(UID)向服务端表明身份id。
服务端接收到认证请求后,发回挑战码,挑战码由服务器每次随机生成(挑战码也经过BASE64编码)
<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
cmVhbG09InNvbWVyZWFsbSIsbm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixxb3A9ImF1dGgi
LGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNzCg==
</challenge>
客户端接收到挑战码后,根据用户输入的密码(原文)按注册用户时保存密码采用Hash算法进行同样的计算,得到与服务后端数据库存储的密码Hash同样的值,再以此为种子对挑战码进行特定算法计算。
具体算法可以用对称加密、二次加盐hash等,经过计算后的挑战码作为响应发回给服务端,如下:
<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
dXNlcm5hbWU9InNvbWVub2RlIixyZWFsbT0ic29tZXJlYWxtIixub25jZT0i
T0E2TUc5dEVRR20yaGgiLGNub25jZT0iT0E2TUhYaDZWcVRyUmsiLG5jPTAw
MDAwMDAxLHFvcD1hdXRoLGRpZ2VzdC11cmk9InhtcHAvZXhhbXBsZS5jb20i
LHJlc3BvbnNlPWQzODhkYWQ5MGQ0YmJkNzYwYTE1MjMyMWYyMTQzYWY3LGNo
YXJzZXQ9dXRmLTgK
</response>
服务端根据之前提供的UID获取用户保存的密码hash值,对响应码进行相同的算法计算后与客户端传递的挑战码响应进行碰撞认证
-- 成功,返回
<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
-- 失败,返回
<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
</stream:stream>
结束流,并关闭TCP连接
分享到:
相关推荐
Messaging and Presence Protocol (XMPP) that provide basic instant messaging (IM) and presence functionality in conformance with the requirements in RFC 2779. This document obsoletes RFC 3921.
xmpp-ftw angular conversejs 克隆这个应用程序用户angluar-xmpp-services。 UI 是从 conversejs 中窃取的。 这是alpha软件
基于XMPP协议的类似QQ的即时通信demo 简单实现了 注册,登录,添加好友,删除好友,好友的通信 包括发文本,图片和声音。
iris:XMPP网络库
IM安全威胁与XMPP安全机制分析,崔振兴,顾治华,安全已成为即时通信发展的主要阻碍。 本文着重讨论了即时通信的安全问题。首先介绍了IM和XMPP, 然后主要讨论了IM系统的各种安全威胁�
乳液:XMPP:left-right_arrow:电报桥
开源xmpp im客户端
XMPP体系架构 XMPP server:其内核是一个XMPP路由器,完成基本组件间的数据包交换和路由。 功能: 1.会话管理器:负责客户端会话认证,在线状态,用户联系表等 2.数据存储器(XDB):连接数据库系统,保持用户信息、...
Psi是为经验丰富的用户设计的功能强大的XMPP客户端。 它具有高度的可移植性,可以在GNU / Linux,MS Windows,macOS,FreeBSD和Haiku上运行。 程序的用户界面在定制方面非常灵活。 例如,有“多个窗口”和“所有...
vacuum-im:跨平台XMPP客户端
XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。 简介:XMPP是一种基于XML的协议,它继承...
XmppStone 轻量级XMPP客户端库完全用Dart编写。 我的意图是为基于Flutter的未来XMPP客户端编写易于使用的库。 支持的文件: RFC6120 :可扩展消息和状态协议(XMPP...消息存档管理2020-10-30:添加了日志记录机制2020-
XMPP模糊器 XMPP-FUZZER 是 XMPP 的模糊测试工具。 它建立在 Smack 库之上。 可惜目前只支持中文。 它最初发布在 code.google.com/p/xmpp-fuzzer 上。 共同开发者:姜峰和( ) 2009年开发。
Android 基于XMPP协议IM聊天实现(客户端+服务端) 源码
xmpp.js Javascript中的服务器端XMPP 是的库,它使您可以作为组件连接到XMPP服务器。 对于那些已经熟悉客户端库的人来说,几乎没有什么要学习的-API几乎完全相同。 唯一的区别是这一次您可以在服务器上运行代码,...
本课程使用asmack、openfire等开源...并且自己用openfire搭建服务端,通过本课程的学习,学员完全可以自己搭建和编写一个完全属于自己的IM聊天系统。在局域网和Internet都可以,只要自己有一个可访问的服务器即可。
ruby_bosh:XMPP BOSH会话预初始化器,用于Ruby Web应用程序
XMPP联合会 “授权用于给定域的流量的方法如何信任连接。” 该方法有两个方面: 确定信任(证明类型) 代表团 校样 有多种方法可以验证与(TLS)连接关联的域: DANE < > 使用HTTPS和PKIX的POSH(在此定义)...
基于XMPP的企业即时通讯IM源代码,delphi开发,包括所有资源文档
有感于3Q大战,自己编写了一个XMPP协议的客户端,目前只实现了简单的基础功能,可以发送消息.其他功能正在开发中.默认已经注册了一个GTalk帐号供测试,大家有自己的GMail帐号也可以直接输入测试.