众所周知,Openfire的注册方式一般有三种:
1.带内注册 ---- In-Band Registration. 即客户端通过匿名方式与Openfire 服务器端建立连接并验证,然后发起注册节点XML流,以XMPPStream的方法直接像服务器注册。code4app上有另外一个XMPP的带内注册demo详细的示范了这个方法(不是我写的)。
优点:不需假设额外的服务器端,适合对java一窍不通的开发者。
弊端:不容易管理用户账号。用户注册的JID无规律,不能够自增长。安全性低。
2.Openfire二次开发(为Openfire写插件) ----- 这种方式是通过下载Openfire(JiveSoftware开放Openfire开源代码)的方式替代直接安装Openfire安装包来进行二次开发。二次开发非常强大,我后面会提到用这种方式获取用户的分组、在线信息、群体推送消息等都非常的方便。但是工作量相对较大,不建议java新手选择。
3.外接Openfire数据库至本机的数据库中,直接操作ofUser表并对其加密方式和字段规则进行模仿,可以达到与后台添加账号完全相同的功效。我的仿微信Demo即是采取的这种方式。
优点:可以使用比JDBC更好用的hibernate来操作openfire中的自带用户表来享受hibernate的性能。生成的jid中的用户名可以自增长的方式方便日后管理。
缺点:不同的电脑,或者重装Openfire都会让加密钥随之改变,所以如果遇到此情况需要将原有密文密码以旧秘钥解密后再使用新秘钥加密。
那么怎么做呢?
1.找到openfire默认数据库中的用户表 ofUser
plainPassword一般不会使用,openfire的用户名密码一般都是用后面的encryptedPassword来存储的,这里我保留了部分明文明码也是为了方便万一大家忘了密码我可以直接告诉他,因为这么多用户我也疏于管理,免费的开源事业不可能还要有客服帮你找回密码对吧。。。
仔细分析这个表的各个Colunm结构之后(如果你是新安装的,你观察amdin这个用户的信息就行了),我们发现如果我们要新建一个用户,很多字段都是可空的,但是为了尽量不影响openfire本身,我决定伪造时间戳与密文密码,然后自增长username来达到注册目的。你这里可以不使用自增长username。
注意 虽然只有3个非空字段,但是实质上你至少要有4个字段,即这3个字段加上 明文 or 密文密码,不然你没有密码怎么登陆。其次,注意看这里的CHAR(15)类型的时间戳,我们知道ios的时间戳是以秒为个位数的浮点数,java的时间戳是以毫秒为单位的13位的整数(至笔者写此博客为止是13位,不排除突破14位的可能,估计要等几百年吧),不难发现这个CHAR其实就是java时间戳的CHAR[]格式数据,这个就非常好办了。userName我们让他自增长,也好办。接下来就是密码了,这里大家最好不要使用明文密码,不然以后登陆出现问题,我不负责。
OK不啰嗦了,简单说下密文密码怎样伪造。首先我们需要研究openfire的加密原理,即他的加密方式。openfire使用其源码中的BlowFish.java 工具类来进行加密,简单的看看他的源码不难发现其加密方式实质为digest。
所以我们要成功伪造一个合格的密码,必须拿到这个文件并且调用他。大家可以到www.hcios.com:8080下载页面java源码中找到他。
这个加密类的工作原理很简单,以每个openfire安装出来后生成的passwordKey作为key,再以时间戳的某种形式作为变量拼接上用户的明文密码一起混合加密。其结果是同一密码不同openfire上加密后的结果不一样,同一密文密码解密后也不一样。即便是同一个server,不同时间加密后的密文密码也不一样,但是解密后的明文密码一样(因为时间戳和明文密码混合在一起加密,时间在变化)。
所以只要passwordKey不变,那么我们的对任意的明文密码在任意时候 进行加密,随时都可以解密回原明文密码。
这个秘钥大家可以在openfire控制台---服务器属性里找到,也可以在ofProperty表中找到他:
passwordKey属性的值(注意每个openfire的值不一样)。
找到他就好办了,
那么就可以写我们的代码:
Blowfish.java的下载地址:http://download.csdn.net/detail/zwdsmileface/8606315
注意:这个文件需要依赖一个slf4j的jar包,这个网上一搜就有。
public static void main(String[] args) {
//注意这里是你的openfire的秘钥
Blowfish _encoder=new Blowfish("cDCTJGMyJv3E473");
ResultSet rs = null;
Statement stmt = null;
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
//new oracle.jdbc.driver.OracleDriver();
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.85:1521:ORCL", "test", "test");
stmt = conn.createStatement();
String encodedStr=_encoder.encryptString("ccc");
String time=String.format("00%d", System.currentTimeMillis());
String sql="insert into ofUser values('ccc','','"+encodedStr+"','','','"+time+"','"+time+"')";
stmt.execute(sql);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null) {
rs.close();
rs = null;
}
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这个代码只是我用JDBC写的一个小的例子,大家可以用hibernate或者其他方法使用,有什么不会的请留言。
分享到:
相关推荐
在企业环境中,通常需要将Openfire与现有的用户管理系统进行整合,以便利用已有的用户数据,如LDAP(轻量级目录访问协议)或数据库中的用户信息。本文将详细介绍如何将Openfire与现有的用户资源进行整合,并扩展其...
在使用 MySQL 作为数据存储时,Openfire 用户经常遇到一个常见的问题,那就是中文字符显示为乱码。这个问题主要体现在以下几个方面: 1. 当用户通过 Openfire 客户端或后台管理系统创建包含中文属性的新账户时,...
2. LDAP集成:Openfire可以与LDAP服务器集成,实现用户身份验证和用户数据的集中管理。 六、故障排查与优化 1. 日志分析:熟悉Openfire的日志系统,学会从日志中查找错误和异常,是解决问题的关键。 2. 性能监控:...
MySQL是Openfire用来存储用户信息、聊天记录等数据的关系型数据库。在Linux CentOS上,安装MySQL的步骤如下: 1. 安装MySQL:`sudo yum install mysql-server` 2. 启动MySQL服务:`sudo systemctl start mysqld` 3....
1. **数据库复制**:Openfire的数据存储通常在数据库中,集群环境下需要数据库提供主从复制或集群支持,保证数据的一致性。 2. **分布式缓存**:利用如Redis这样的分布式缓存系统,存储用户的在线状态和会话信息,...
总的来说,"基于Openfire 仿QQ"项目展示了如何利用开源技术实现一个功能完备的即时通讯应用,涉及到Android客户端开发、服务器集成、即时通讯协议、用户体验优化等多个方面,对于学习和研究即时通讯系统有着很高的...
8. **database** 目录:可能包含数据库相关的脚本或配置,用于与Openfire的数据库交互,比如用户数据存储、聊天记录管理和权限控制等。 综合上述文件,我们可以推测这个Openfire企业版插件可能涉及以下知识点: - ...
Spark是Openfire配套的桌面客户端,而Web Client则允许用户在浏览器中直接进行即时通讯。本文将详细阐述如何安装配置Openfire 3.8版本,并构建Spark和Web Client环境,以实现高效且便捷的沟通体验。 一、Openfire的...
8. **优化与扩展**:你可以根据需求对Openfire进行定制,比如使用外部数据库(MySQL、PostgreSQL等)来存储用户数据,增加插件来实现更多功能,如文件传输、语音/视频通话等。 9. **安全性考虑**:为了保障用户隐私...
本项目聚焦于基于Openfire的Android聊天软件开发,旨在为用户提供一个可以注册、登录、聊天、查找和添加好友的全方位沟通平台。 【描述】:“基于openfire的Android聊天软件,可注册 登陆 聊天 查找 添加好友” ...
在IT领域,部署一个实时通信系统对于许多企业和项目来说至关重要,而Jwchat与Openfire的结合使用就提供了一个高效且可定制化的解决方案。本文将详细介绍Jwchat和Openfire的部署过程及其相关知识点。 首先,Jwchat是...
3. **可扩展性**:Openfire的插件架构使其易于扩展,开发者可以通过编写插件来增加新功能,如视频通话、会议、多语言支持等。 4. **管理员工具**:Openfire提供了一个Web界面,管理员可以通过浏览器轻松管理用户、...
4. **数据库交互(Database Interaction)**:Openfire插件可能需要存储或检索数据,因此会有与数据库交互的代码,这通常涉及JDBC连接和SQL查询。 5. **XML配置文件(XML Configuration Files)**:Openfire插件的...
综上所述,Openfire消息回执插件通过DbChatLogsManager管理数据库中的聊天记录,ChatLogPlugin作为插件核心处理回执事件,并且ChatLogs提供对聊天记录数据的抽象和操作。这三者共同协作,实现了Openfire中的消息回执...
7. **数据库集成**:除了默认的HSQLDB,Openfire还支持MySQL、PostgreSQL等其他关系型数据库,以满足大规模用户环境下的性能需求。 8. **多语言支持**:Openfire支持多种语言,包括中文,这使得非英语地区的用户也...
- 安装过程中,可以选择创建数据库(默认为HSQLDB)或连接已有的数据库(如MySQL、PostgreSQL)。 - 完成安装后,通过浏览器访问`http://localhost:9090/`,输入默认的管理员账号(admin/admin),登录Openfire...
"openfire_3_7_1 for linux"指的是Openfire的3.7.1版本,专为Linux操作系统设计。在安装Openfire之前,我们需要了解以下几个关键知识点: 1. **Linux基础**:由于Openfire是为Linux环境设计的,因此熟悉Linux操作...
JSP页面可以用于用户交互界面,而Servlet则处理这些请求,与Openfire服务器进行数据交换,操作用户数据。 开发过程中,还需要注意以下几点: - 使用Openfire提供的API与服务器进行交互,例如,使用`org.jive...
3. **安全通信**:Openfire支持SSL/TLS加密,确保了用户数据传输的安全性,防止信息在传输过程中被窃取或篡改。 4. **多语言支持**:Openfire可以提供多种语言的界面,方便不同地区用户使用。 5. **插件扩展**:该...
9. 性能优化:根据你的用户规模和需求,可能需要对Openfire进行一些性能调优,比如调整内存分配、启用集群模式、优化数据库连接池等。 10. 移动客户端支持:Openfire可以与许多支持XMPP协议的移动IM应用配合使用,...