直接操作数据库数据来为Openfire注册新用户

众所周知,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或者其他方法使用,有什么不会的请留言。

时间: 2024-08-24 19:04:36

直接操作数据库数据来为Openfire注册新用户的相关文章

从数据库获取最大手机号+1注册新用户

import unittestfrom common.get_request import GetRequestfrom common.read_data import ReadDatafrom ddt import ddt, datafrom common import constantfrom common.read_mysql import ReadMysqlimport json @ddtclass TestRegister(unittest.TestCase): ""&quo

直接操作数据库数据来为Openfire用户添加好友

[size=large]openfire中实现好友添加及分组管理. 主要基于两张table实现:ofroster,ofrostergroups. ofroster:用于记录好友关系(一对好友关系用两条记录来实现) ofrostergroups:用于记录好友分组 特别说明:openfire中用户的主键是自然主键,也就是username.没有使用自增ID. 我们先来看一下官方(http://www.igniterealtime.org/builds/openfire/docs/latest/docu

如何实现共享软件网络授权认证,包括注册新用户、登录、修改密码等操作

开发共享软件,传统的是采用注册码验证方式,这种方式是大多数共享软件采用的方式,另外还有一种常见的验证方式,就是通过网络授权认证的方式,这种方式通过在程序中调用服务器的服务进行.一般具有验证用户名可用.注册新用户.用户登录认证.用户修改密码等操作,另外还需要配备一个网络授权入口给管理员对注册的用户进行授权控制. 这个是为了进行网络授权认证搭建的一个简单的管理后台,用户在共享软件客户端通过调用服务器的服务连接,可以注册一个新用户,或者进行登录获取身份信息(试用.已注册.已禁用等状态),还可以通过服务

录播教室预约系统(六)-注册新用户

预约系统中,新用户可以自己注册,然后管理员开通. 注册界面如下: 客户端新用户注册代码:       button1_Click((txtUserID.Text.Trim ()==|| txtUserName.Text.Trim ()=== ==== = newTcpConnection.SendReceiveObject<ResMessage>(, ,  (resMessage.Message ==  + 服务器端的相关处理代码: 构造函数中声明:   //注册新用户            

本篇文章主要是对jquery+ajax+C#实现无刷新操作数据库数据的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助

我们知道同步执行和异步执行的区别,为了更好的提高用户的体验,我们都会采用异步方式去处理一些问题,毕竟单线程的同步可能回造成卡死等现象,很不友好,所以可以使用ajax来完成用户的体验,现在我们就来说说如何使用jquery的ajax来实现无刷新的获取内容 我们只是单方面的获取内容,分页等就不考虑了,后期会讲到无刷新的分页 页面中我们放置一个Div容器用来存放返回的内容 <div id="comment"><img src="images/Wait.gif&quo

python操作数据库-数据表

数据表: 数据类型: 帮助的三种形式: 在cmd中输入: help 要帮助的主题词,或 ? 要帮助的主题词 或  \h 要帮助的主题词 . 数据表的创建: CREATE database IF NOT exists zbltest2 default character set 'utf8'; USE zbltest2; CREATE TABLE IF NOT EXISTS `user`( id SMALLINT, username VARCHAR(20) ) ENGINE=INNODB CHAR

我的第三行PHP代码之接受安卓端get请求,注册新用户写入数据库

<?php $con=mysql_connect("localhost","root","") or die("failed to connect db"); mysql_select_db("lio")or die ("failed to select db"); $user=$_GET['user']; $passwd=$_GET['passwd']; $i="INS

朝花夕拾-android 一个注册新用户时,多步填写用户资料的框架

源码地址:http://git.oschina.net/zj2012zy/Android-Demo/tree/master/AndroidDemo/setpregister 效果如下: 基本思路: 1.定义一个抽象类: RegisterStep 1 public abstract class RegisterStep { 2 public interface OnNextActionListener { 3 void next(); 4 5 void submit(); 6 } 7 8 prot

JDBC操作数据库的详细步骤

JDBC操作数据库的步骤: 1.注册驱动 告知JVM使用的是哪一个数据库的驱动 2.获得连接 使用JDBC中的类,完成对MySQL数据库的连接 3.获得语句执行平台 通过连接对象获取对SQL语句的执行者对象 4.执行sql语句 使用执行者对象,向数据库执行SQL语句 获取到数据库的执行后的结果 5.处理结果 6.释放资源  一堆close() 1.注册驱动,发射技术,将驱动加入到内容 使用java.sql.DriverManager类静态方法 registerDriver(Driver driv