一、SASL概念
1、SASL跟OF什么关系?
Openfire(简称of),他是基于XMPP协议开发的,XMPP架构如下:
2、SASL到底是什么?
引用百度百科的废话:http://baike.baidu.com/view/1014674.htm
SASL全称Simple Authentication and Security Layer,是一种用来扩充C/S模式验证能力的机制。在Postfix可以利用SASL来判断用户是否有权使用转发服务,或是辨认谁在使用你的服务器。
SASL提供了一个通用的方法为基于连接的协议增加验证支持,而XMPP使用了一个普通的XML名字空间来满足SASL的需要
说白了,就是一种身份验证机制,鉴权用户的身份用。一般很多网站验证身份也就是提交用户名和密码,服务端进行判断即可。SASL他也一样,只不过他的传输的内容多样化了。
3、SASL流程是如何的?
SASL验证方式多样化,有如下方式:CRAM-MD5, EXTERNAL, GSSAPI, ANONYMOUS, PLAIN, SECURID, DIGEST-MD5, LOGIN, NTLM。
of他支持哪些方式了?来看看of发送的东西:
<stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"></starttls><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>DIGEST-MD5</mechanism><mechanism>PLAIN</mechanism><mechanism>ANONYMOUS</mechanism><mechanism>CRAM-MD5</mechanism></mechanisms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><auth xmlns="http://jabber.org/features/iq-auth"/><register
xmlns="http://jabber.org/features/iq-register"/></stream:features>
看看上面黄色底部的,他支持了SASL四种验证机制。
我使用DIGEST-MD5看流程:
Of服务端:“喂,您好我有上面四种验证方式,你来选择一种告诉我吧”。
Of客户端:“老大,我要选择DIGEST-MD5”
<auth mechanism="DIGEST-MD5" ></auth>
Of服务端:“很好,来,我发送一个质询给你——其实就是用来加密的一些参数数据和加密算法,内容是:
realm="gsd",nonce="r52TbJKIRFuhMEahubcX9q1l35CtNWP22mf3eYCr",qop="auth",charset=utf-8,algorithm=md5-sess
注意了:基于xml的sasl对话,需要把内容信息经过base64编码,服务端发送了一个唯一的临时信息“nonce”,只能使用在一次验证中。
Of客户端:“好的,我将根据你发送过来的信息,对我的用户名和密码进行加密,得到一个值放在response(key)给你哈。等等”
发送的内容是:
charset=utf-8,username="*****",realm="gsd",nonce="r52TbJKIRFuhMEahubcX9q1l35CtNWP22mf3eYCr",nc=00000001,cnonce="9RvMVSw2INjosXIoTV09ycC8UPRDpWnPhXbSn/XW",digest-uri="xmpp/gsd",maxbuf=65536,response=1de05c0734e4aaf391a220eaca5e7b35,qop=auth,authzid="*****"
其中,这个非常重要:response=1de05c0734e4aaf391a220eaca5e7b35,他是根据什么来计算出来的了?
DIGEST-MD5算法,使用的参数数据有:cnonce,qop,nc,digest-uri,ha1,而
其中ha1这个值就是通过md5-sess这个算法来计算出来的,所需要的参数是: realm值,nonce,用户名,用户名密码,cononce。(md5-sess和md5应用上最大的区别,一个需要密钥,另一个不需要密钥)
Of服务端:“客户端兄弟,我收到你的数据了,我将从数据库中获取出该用户的密码,然后也根据我约定的algorithm=md5-sess算法进行加密(参数跟客户端加入的一模一样)得出response值,看看是否等于你发送过来的
response=1de05c0734e4aaf391a220eaca5e7b35,如果是相同,那么该用户就可以登录了,我将反馈一个信息给你:
<success>rspauth=bdbf055a7f60947a2c2d71760e84e38b</success>。告诉你用户登录成功了”
4、SASL优势——digest-md5
密码不用在网络上传输,而且验证过程所交换的密钥只能使用一次。
二、android版本接口包的bug
问题描述:我们在开发过程使用上面的digest-md5 SASL验证方式验证用户登录,但是老是登录不成功。
问题在于:因为我们使用邮箱包含@,而xmpp中@的有特殊含义,所以在传输过程邮箱的@需要被转义成\40。但是asmack没有对”\”认真处理直接把邮箱的值放入到response中,而这个邮箱值是带引号的,会自动对\进行转义。
来看看asmck的粗心的地方:
digestResponse.append("username=\"");
digestResponse.append(m_authorizationId);
如果m_authorizationId=”haiji\\40163.com.cn”,他放入到“”中,会变成haiji\40163.com.cn少了一个\,到服务端他得到的是”haiji\40163.com.cn”,但他到服务端又是在引号里面,又需要对\转义变成了haiji163.com.cn,出错了。
正确的做法,应该看http://www.docjar.com/html/api/com/sun/security/sasl/digest/DigestMD5Client.java.html这里面的代码:
digestResponse.append("username=\"");
digestResponse.append(quotedStringValue(m_authorizationId));
三、快速对称加密算法——blowfish
1、对称加密算法
说白了密钥是相同的,非对称密钥是不相同的(RSA),逆向加密算法(md5)加密后不能还原的
2、什么是Blowfish算法
跟着百度来解读吧:
百度上面说blowfish算法是用来加密64bit分组(怎么分组?采用cbc模式——具体内容看我之前的文章《加密算法研究.docx》)长度的字符串,如果某一个字符串长度不够了?或者长度超过超过了怎么办?请看我的文章关于补位方面的知识《加密算法研究.docx》。
Blowfish算法有两个盒子unsignedlongpbox和unsignedlongsbox,这两个盒子是根据源密钥pbox和sbox跟我们用户提交的密钥变换得到的。Pbox和sbox是固定的,sbox他是根据“π”来生成的。具体流程:
P数组由18个32位子密钥组成:
P1,P2,P3,……P18
4个32位的S盒,每个有256个单元:
S[1,0],S[1,1],S[1,2],……S[1,255]
S[2,0],S[2,1],S[2,2],……S[2,255]
S[3,0],S[3,1],S[3,2],……S[3,255]
S[4,0],S[4,1],S[4,2],……S[4,255]
计算过程如下:
1.初始化P数组,然后是4个S盒用固定的串.这些串由π的十六进制组成.
2.用密钥的第一个32位与P1异或,用密钥的第二个32位与P2异或,依此类推,直到密钥的所有位(直到P18).周期性地循环密钥的所有位直到整个P数组与密钥异或完为止.
3.利用Blowfish算法加密全零串,其密钥为在第1和第2步中描述的子密钥.
4.用第3步的输出取代P1和P2.
5.利用Blowfish算法加密第3步的输出,其密钥为修改过的子密钥.
6.用第5步的输出取代P3和P4.
7.重重上述操作,直到P数组的所有元素及4个S盒全部被连续变化的Blowfish的输出所取代.
Blowfish是一个由16轮构成的Feistel结构.输入是64位数据x,加密过程为:
把x分成32位的两部分:xL,xR
对于i=1至16
xL=xL^Pi
xR=F(xL)^xR
交换xL和xR(最后一轮取消该运算)
xR=xR^P17
xL=xL^P18
重新合并xL和xR
四、Blowfish家住of
Of的blowfish密钥放在哪里?请查看数据库ofProperty
五、遗留问题以及改进
1、【问题】Of为什么采用blowfish保存密码?这个待考证……
密码应该尽量使用单向散列算法的
2、【解决】
目前我们要求是对密码先使用base64(HMAC-SH1(password))得到单向的散列字符串,然后在使用blowfish进行加密,最后保存到数据库中。
相关推荐
本文档旨在提供详细的指导方案,帮助您了解如何通过配置Openfire与自定义数据库集成,以支持用户认证、查询等功能。 #### 二、背景知识 在进行Openfire与用户数据库的集成之前,我们需要对以下几个概念有一定的...
配置插件后,Openfire会查询数据库进行用户认证和授权,确保用户登录的一致性。 3. **导入现有用户**:对于已经存在的一批用户,Openfire提供了批量导入用户的功能。可以通过CSV或其他格式的文件,将用户信息...
在本文中,我们将深入探讨OpenFire系统及其所有在线用户的管理。 首先,让我们理解"OpenFire所有在线用户"这个标题。这指的是OpenFire服务器上的功能,它能够追踪并显示当前处于在线状态的用户。通过服务器的插件...
NULL 博文链接:https://baobeituping.iteye.com/blog/1458842
自己写的获取所有在线用户的openfire插件,直接上传到openfire服务器即可使用,访问路径为host:port/plugins/onlines/listall
这个服务可以是基于HTTP的API,例如RESTful API,接收来自Web接口的请求,验证请求的合法性,并调用Openfire提供的API来执行用户入群操作。 4. **调用Openfire API**:Openfire提供了丰富的管理API,可以通过这些...
标题中的“openfire扩展整合现有系统用户”是指在Openfire这款开源即时通讯服务器上,将已有的用户系统(如企业内部的LDAP、AD等)与Openfire进行集成,实现用户身份验证和管理的一体化。Openfire是一款基于Java开发...
在Openfire中,实现用户接收消息的计数功能是提升通信效率和监控系统性能的重要一环。本文将深入探讨如何利用"openfire的用户接收消息计数器"这一工具来实现这一目标。 首先,我们要理解计数器的工作原理。计数器...
1. 可扩展性:Openfire支持插件扩展,可以根据需求添加功能,如群聊、文件传输、用户认证等。 2. 安全性:Openfire支持SSL/TLS加密,保证了数据传输的安全性。 3. 高性能:采用高效的XMPP引擎,能处理大量并发连接,...
此外,还会涉及与其他系统的集成,如LDAP目录服务的对接,以实现用户认证的集中化管理。 服务器的安全性是至关重要的。书中的安全章节将指导你如何确保OpenFire的安全,包括防火墙配置、防止DDoS攻击、数据加密、...
Openfire安装配置手册 Openfire是一个基于XMPP协议的即时通讯服务器,提供了强大的聊天功能和插件架构。本手册将指导您搭建开发环境,安装和配置Openfire服务器。 一、 搭建开发环境 要搭建开发环境,需要安装...
2. LDAP集成:Openfire可以与LDAP服务器集成,实现用户身份验证和用户数据的集中管理。 六、故障排查与优化 1. 日志分析:熟悉Openfire的日志系统,学会从日志中查找错误和异常,是解决问题的关键。 2. 性能监控:...
对Openfire进行扩展,支持在线指定聊天室和全部在线人员的查看。
- 配置Jwchat的认证方式为Openfire,使两者能进行身份验证同步。 - 测试Jwchat与Openfire的连接,确保用户可以成功登录并进行实时通信。 4. **部署Jwchat**: - 将Jwchat部署到Web服务器,如Apache、Nginx等,...
6. **安全与身份验证**:Openfire支持多种认证方式,包括基本的用户名/密码、LDAP集成、单点登录(SSO)等。Webchat会利用这些机制来验证用户身份,并确保通信的安全性。 7. **多语言支持**:Openfire Webchat通常...
- 开发者需要在Android客户端中集成Smack库,这是Openfire官方推荐的XMPP客户端库,用于处理与服务器的连接、认证、会话管理和消息交换。 - 集成过程中,开发者需要设置服务器地址、端口、用户名、密码等信息,...
源码中,`UserManager`和`AuthProvider`接口及其实现类揭示了用户数据的存储和验证机制。 2. 聊天记录存储:`persistence`模块处理数据持久化,包括聊天记录的保存。`JDBCProvider`实现了基于数据库的存储,使得...
在Linux环境下,Openfire是一款基于Java的开源即时通讯(IM)服务器,它允许用户通过XMPP协议进行实时通信。为了在Linux系统上成功安装并配置Openfire,我们需要遵循一系列步骤,涉及的主要组件包括JDK(Java ...
3. **登录接口**:在应用中,用户输入用户名和密码后,调用XMPP库提供的API,建立与Openfire服务器的连接,并进行身份验证。通常,会有一个登录方法,比如`XMPPTCPConnection.login(username, password)`。 4. **...