XMPP(Extensible Messaging and Presence Protocol)是一个应用于实时通信的开放协议,定义了有关即时消息通信的各方面内容,本文主要是关于XMPP安全机制的介绍以及设计实现思考。

XMPP包含一个保证流安全的方法来防止篡改和偷听,包括两个层次的安全机制,分别是TLS(Tansport Layer Security)和 SASL(Simple Authentication Security Layer)。

TLS主要用于保证传输通道安全,SASL用于用户鉴权认证,协商流程如下:

1. 客户端发起,流初始化(建立TCP连接,发送如下格式数据)

<stream:streamfrom='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:streamfrom='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:streamfrom='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:streamfrom='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'>cmVhbG09InNvbWVyZWFsbSIsbm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixxb3A9ImF1dGgiLGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNzCg==
</challenge>

客户端接收到挑战码后,根据用户输入的密码(原文)按注册用户时保存密码采用Hash算法进行同样的计算,得到与服务后端数据库存储的密码Hash同样的值,再以此为种子对挑战码进行特定算法计算。

具体算法可以用对称加密、二次加盐hash等,经过计算后的挑战码作为响应发回给服务端,如下:

<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>dXNlcm5hbWU9InNvbWVub2RlIixyZWFsbT0ic29tZXJlYWxtIixub25jZT0iT0E2TUc5dEVRR20yaGgiLGNub25jZT0iT0E2TUhYaDZWcVRyUmsiLG5jPTAwMDAwMDAxLHFvcD1hdXRoLGRpZ2VzdC11cmk9InhtcHAvZXhhbXBsZS5jb20iLHJlc3BvbnNlPWQzODhkYWQ5MGQ0YmJkNzYwYTE1MjMyMWYyMTQzYWY3LGNoYXJzZXQ9dXRmLTgK
</response>

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

-- 成功,返回

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

-- 失败,返回

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

结束流,并关闭TCP连接

踏莎行·术 - IM设计思考:XMPP安全机制相关推荐

  1. 踏莎行·术 - IM设计思考:XMPP消息格式

    交换消息是XMPP的一个基本用途并且随之而来的是一个用户生成一个发给另一个实体的消息节. XMPP定义的消息节语法完整格式如下: <messagefrom='juliet@example.com ...

  2. 踏莎行·术 - IM设计思考:XMPP资源绑定

    XMPP协议设计中引入了一个抽象的资源绑定过程,何为资源,如何绑定? 首先这得从JID的格式设计说起,JID是XMPP前身Jabber协议ID的简写,用于唯一标识一个客户身份.一个合法的 JID 包括 ...

  3. 踏莎行·术 - IM设计思考:试问

    用过IM很多年了,直到最近才开始好好想想IM的实现需要考虑哪些方面? 特别是在海量用户的IM环境下,需要考虑哪些方面,自己大概思考了下总结如下: 1. 海量接入 QQ的最高在线用户超过了1亿,那么大约 ...

  4. 踏莎行·术 - IM设计思考:点对点消息交换

    IM最基本的功能就是即时消息交换,那么一个送出的消息将经历哪些过程才能最终送达目的地? 下面给出一个过程描述: 1. 消息从客户端发出经过网络由客户端所直接连接的服务器接收 2. 接入服务器接收到网络 ...

  5. 面试必备:一个秒杀系统的设计思考

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:阿哲 segmentfault.com/a/11900000 ...

  6. 用thinkphp进行微信开发的整体设计思考

    用thinkphp进行微信开发的整体设计思考 http://www.2cto.com/weixin/201504/388423.html 2015-04-09      0个评论       作者:明 ...

  7. 一个秒杀系统的设计思考

    简介:从架构视角来看,秒杀系统本质是一个高性能.高一致.高可用的三高系统.而打造并维护一个超大流量的秒杀系统需要进行哪些关注,就是本文讨论的话题. 秒杀大家都不陌生.自2011年首次出现以来,无论是双 ...

  8. 【忘川风华录】雅社——公会社交系统交互设计思考

    GameTube邀请忘川交互团队分享设计中的经验和感受.本次为<忘川风华录>交互设计师[丸子]分享公会系统的设计思考.此篇为忘川设计复盘系列完结篇~ 期待之后会有更多交互同学分享设计的经历 ...

  9. RESTful API 设计思考

    RESTful API 设计思考,内容来源网络加自己的思考 1.RESTful Web API采用面向资源的架构:同一的接口,所以其成员体现为针对同一资源的操作 2.SOAP Web API采用RPC ...

最新文章

  1. 软件包管理 之 软件在线升级更新yum 图形工具介绍
  2. JAVA 13 (集合框架)
  3. 白瑜庆:知乎基于Kubernetes的kafka平台的设计和实现
  4. NLTK自然语言处理简介
  5. niceScroll 的使用
  6. DAS、NAS、SAN、IPSAN、iSCSI-SAN及IDE、SAS、SCSI、iSCSI简介
  7. 如何理解 Python 之禅:Explicit is better than implicit?
  8. 有趣的计算机课的作文,有趣的电脑课作文400字
  9. 数字后端——信号完整性分析
  10. 基于Springboot的漫画之家管理系统
  11. 攻防世界新手区MISC-如来十三掌
  12. 深入理解Solaris X64系统调用
  13. AT命令控制上网 PDP
  14. 【创作赢红包】如何提高写作水平?让写作成为你的强项。
  15. 【P02】47耳放的优化版本,全资料下载
  16. [解锁新姿势] 兄dei 我感觉你在写bug
  17. 开始使用ABP.CORE模板 (ASP.NET Core with Angular)
  18. 硬件科普系列之硬盘——前言与准备知识篇
  19. 鼎捷ERP二维码整体解决方案 Tiptop GP条码管理系统 鼎捷ERP移动解决方案 鼎捷条码扫描 鼎捷WMS仓库移动扫码 鼎捷安卓PDA扫码方案 Tiptop 出入库盘点出货条码扫码
  20. css透明度属性简介

热门文章

  1. librosa | 梅尔谱图最幽默的解释
  2. iphone计算机怎么设置,电脑怎么设置苹果id
  3. redis缓存雪崩、穿透、击穿概念、布隆过滤器小结及解决办法
  4. 优信二手车:赛道虽好,生意难做
  5. wps启用编辑按钮在哪里_在wps工具栏中添加按钮的方法介绍
  6. excel如何排序?两个方法汇总
  7. Java基础课-MySQL语法
  8. MySQL命令行方式执行sql文件
  9. 最课程阶段大作业06:U度节能平台控制系统
  10. 阿里云为什么要进军物联网?