[XMPP]我是怎么通过直接操作数据来为Openfire注册新用户的

2023-05-16

众所周知,Openfire的注册方式一般有三种:

1.带内注册 ---- In-Band Registration. 即客户端通过匿名方式与Openfire 服务器端建立连接并验证,然后发起注册节点XML流,以XMPPStream的方法直接像服务器注册。code4app上有另外一个XMPP的带内注册demo详细的示范了这个方法(不是我写的)。

优点:不需假设额外的服务器端,适合对java一窍不通的开发者。

弊端:不容易管理用户账号。用户注册的JID无规律,不能够自增长。安全性低。

2.Openfire二次开发(为Openfire写插件) ----- 这种方式是通过下载Openfire(JiveSoftware开放Openfire开源代码)的方式替代直接安装Openfire安装包来进行二次开发。二次开发非常强大,我后面会提到用这种方式获取用户的分组、在线信息、群体推送消息等都非常的方便。但是工作量相对较大,不建议java新手选择。

3.外接Openfire数据库至本机的mySQL 数据库中,直接操作ofUser表并对其加密方式和字段规则进行模仿,可以达到与后台添加账号完全相同的功效。我的仿微信Demo即是采取的这种方式。

优点:可以使用比JDBC更好用的hibernate来操作openfire中的自带用户表来享受hibernate的性能。生成的jid中的用户名可以自增长的方式方便日后管理。

缺点:不同的电脑,或者重装Openfire都会让加密钥随之改变,所以如果遇到此情况需要将原有密文密码以旧秘钥解密后再使用新秘钥加密。


OK,本博客主要讨论的就是方法3了,在讨论此方法之前,读者首先要能够赞同这种方式,其次,您需要在openfire安装的时候选择外接数据库,并导入到mysql中。


确定openfire数据库外接至mysql成功并且配置完成后,我们就可以开始注册行动了。


1.找到openfire默认数据库中的用户表 ofUser






呵呵,这就是我的demo所使用的数据库了,383以前的用户被我删掉了,现在已经有1143个人注册了我的demo,所以你们的用户名与密码都在这里~ 注意,这里的plainPassword一般不会使用,openfire的用户名密码一般都是用后面的encryptedPassword来存储的,这里我保留了部分明文明码也是为了方便万一大家忘了密码我可以直接告诉他,因为这么多用户我也疏于管理,免费的开源事业不可能还要有客服帮你找回密码对吧。。。


仔细分析这个表的各个Colunm结构之后(如果你是新安装的,你观察amdin这个用户的信息就行了),我们发现如果我们要新建一个用户,很多字段都是可空的,但是为了尽量不影响openfire本身,我决定伪造时间戳与密文密码,然后自增长username来达到注册目的。你这里可以不使用自增长username。


既然我们要模仿openfire的原生行为来炮制一场虚拟的注册,那么我先分析下这个表的各个column的类型:



注意 虽然只有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不变,那么我们的对任意的明文密码在任意时候 进行加密,随时都可以解密回原明文密码。


Let's move,find the passwordKey!

这个秘钥大家可以在openfire控制台---服务器属性里找到,也可以在ofProperty表中找到他:


复制其value,然后我们可以创建一个servlet了(一个带void main的java文件也可以),将其粘贴至源码中并将其作为Blowfish实例的初始化方法的参数:

static Blowfish _encoder=new Blowfish("4MMl61yXu1r16n6");

然后我们就可以在任何地方进行加密了,例如:

String oStr="admin";
String encodedStr=_encoder.encryptString(oStr);

那么如果你忘记了你的admin密码进不去管理中心,这个方法也同样可以轻松帮你搞定,你只需要将这个password输出并且复制到数据库中粘贴到encryptedPassword中,然后重启openfire即可。



加密到这里就OK了,解密的话只是需要调用deencryptString方法即可。同样也可以帮你找回密码,你只需要去数据库中找到加密后的密码然后解密输出,就可以直接登陆了。


接下来我们只需要拼凑出2个非空的时间戳即可。为了节约篇幅,我这里直接给出注册Openfire的私有方法代码:

public boolean registerOpenFireUser(int userName,String userPassword) {
			String encodedStr=_encoder.encryptString(userPassword);
			try {
				OfUser openFireUser=new OfUser(String.valueOf(userName), userPassword, encodedStr, "", "", String.format("00%d", System.currentTimeMillis()), String.format("00%d", System.currentTimeMillis()));
				OfUserDAO ofDAO=new OfUserDAO();
				ofDAO.save(openFireUser);
				
				return true;
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
				return false;
			}
			
		}

这里的00%d能这样写就是因为时间戳是13位的,补上2个0即可与系统生成的一致,伪装的毫无痕迹。

这里的Dao类我是用hibernate反向生成的,读者用jdbc直接插入一行ofUser也可以。

至此我们只需要在servlet中获取到用户的userName userPassword,然后执行这个方法就可以了。

registerOpenFireUser(thisUser.getUserId(), userPassword);

OK,如果你是一个有经验的java程序员,我相信你已经写了一个非常好的servlet来替你注册了!就像我这个API地址一样,里面包含了用户头像,昵称,等等。http://www.hcios.com:8080/user/register.html




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[XMPP]我是怎么通过直接操作数据来为Openfire注册新用户的 的相关文章

  • 使用 strope js 基于 Javascript 的 XMPP 聊天客户端 - 示例和教程? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想制作一个简单的基于 javascript 的 XMPP 客户端 我偶然发现了 strope js
  • 将 XMPPPresence 更改为离开/忙碌/不可见

    您如何更改您的状态以显示 dnd away 等 XMPPPresence presence XMPPPresence presenceWithType status self appDelegate xmppStream sendEleme
  • XMPP BOSH 与 COMET

    我想编写一个实时聊天应用程序 并且需要决定使用哪些技术 这些技术之间有什么区别 您更喜欢哪一种 为什么 WebSockets 不是一个选择 因为它还没有准备好在野外战斗 Thanks 你应该阅读这个问题 为什么 BOSH 没有更受欢迎 尤其
  • XMPP 带有支持 X-FACEBOOK-PLATFORM 的 Java Asmack 库

    我正在尝试使用 Smack 库在 Android 上进行 Facebook 聊天 我读过Chat API http developers facebook com docs chat 来自 Facebook 但我不明白如何使用这个库向 Fa
  • XEP - 0055 与 iOS 和 ejabberd?

    我正在尝试实现 ejabbed 支持的 XEP 0055 如下所示支持的 xep https www ejabberd im protocols 这是我的要求 XMPPIQ iq XMPPIQ alloc init iq addAttrib
  • 我在 ejabberd (17.07) 上的 Android 设备上尝试使用 smack api(4.2) 注册用户时遇到错误

    我试图找出错误的原因 但找不到 如果有人可以提出一种方法 我们将不胜感激 早些时候我使用的是带有默认 mnesia 的 ejabberd 2 1 版本 运行良好 我能够从 Android 应用程序注册用户 但是现在当我用mysql安装新的e
  • 如何断开 XMPPPY 客户端对象的连接

    使用 XMPPPY 连接到 XMPP 服务器非常简单 from xmpp client import Client as XMPPClient self xmppClient XMPPClient jabber foo com if not
  • XMPP - 名册订阅说明

    假设我的 Jabber 服务器上有 2 个用户 Alice 和 Bob 添加到名册中并订阅为both 我需要执行以下步骤 Alice 向 Bob 发送订阅请求 当 Bob 收到请求时 他会批准该请求 Bob 可能也对 Alice 的存在感兴
  • XMPP:未读消息计数

    我正在尝试通过以下功能为我的网络应用程序实现聊天 当用户登录时 他应该看到许多未读消息 这既是离线消息又是 未见 我将在下一步中解释 未见 当用户位于应用程序中的任何位置但在聊天窗口上时 应该通知他有新消息 消息应标记为 未读 并且必须添加
  • 是否有任何选项可以禁用开火服务器上的群聊消息历史记录?

    我一直在创造group chat application 在实现群聊功能时我面临问题 当我每次join the room open fire sends last two days messages 这是我每次加入房间时收到的帖子消息
  • 是否可以在没有服务器的情况下实现 XMPP 点对点连接?

    我正在使用 libjingle 进行 XMPP 连接 我可以连接两个 XMPP 客户端而不需要中间有服务器吗 如果是的话我该怎么做如果不是那么为什么不可能呢 XMPP 客户端1 XMPP 客户端2 您可能无法直接使用 libjingle 执
  • 在 Android 4+ 中使用 Android TrustStore for aSmack (ICS)

    我不是密钥库方面的专家 并且很难理解其中的细微差别 但这就是我所取得的进展 在使用 asmack 构建创建 xmpp 连接时发现here https github com Flowdalic asmack人们仍然需要更改信任库 通常可以说是
  • ejabberd如何编译新模块

    Here http www ejabberd im node 2872我找到了代码 erlc I ejabberd 2 1 13 lib ejabberd 2 1 13 include pa ejabberd 2 1 13 lib ejab
  • Android GCM:了解 XMPP

    我正在尝试使用应用程序在我的 GCM 中实现 XMPP 协议 但即使经过广泛搜索 我也不理解其背后的概念 另外 也许我并不真的需要 XMPP 来完成我想用我的应用程序做的事情 但我喜欢学习东西 让我们以 HTTP 为例 我的应用程序将 he
  • 如何在 XMPP 中实现“上次查看时间”功能(如 Whatsapp)?

    我正在开发一个聊天应用程序 并希望添加 上次查看时间 功能 我正在尝试使用存在节来实现它 但遇到一个问题 请检查下面的链接 当用户 B 也不可用时 未获取用户 A 的不可用状态 https stackoverflow com questio
  • Google Talk XMPP - 什么是 X-GOOGLE-TOKEN?

    我正在尝试向 Google Talk 进行身份验证 这X OAUTH2使用 OAuth2 令牌的机制是有据可查 https developers google com talk jep extensions oauth 但什么是X GOOG
  • 使用自定义 mysql 模式的模块扩展 ejabberd?

    代替ejabberd sql https github com processone ejabberd blob master sql mysql sql L95 我正在使用自定义 MySQL 架构 由于遗留原因 我将对某些活动执行一些数据
  • Node.js 上的 starttls > 0.4.0

    我遇到了这个线程Node js HTTPS 安全错误 https stackoverflow com questions 5136353 node js https secure error其中提到 tls 模块是现在在节点上执行 TLS
  • 使用 Strope.js 在 openfire 上进行新注册

    我使用 strope js 库和 Openfire 在浏览器中发送和接收 XMPP 消息 它工作正常 但仅适用于我的联系人列表 花名册中已有的用户 我需要让新用户注册 我知道如何将现有人员添加到我的名册中 但我不知道如何在 openfire
  • 将 Jabber/XMPP 与其他系统集成(身份验证、密码共享)

    是否可以指示 jabber xmpp 服务器将身份验证委托给另一个模块 我们正在使用 XMPP 构建一个内部应用程序 如果我们能让用户保留他们在我们的 Web 应用程序中使用的标准用户名 密码 那就太好了 网络应用程序当前正在对密码进行哈希

随机推荐