openfire的用户名密码存在ofuser表中,虽然原表中存在两个字段plainPassword和encryptedPassword,但默认情况下,of只会保存加密后的密码,即encryptedPassword,而明码plainPassword是置空的。
那怎么通过encryptedPassword获得plainPassword。实际上,of的加密策略是双向加密的,知道密钥后是可以将密文转为明文的。那怎么解密哪。答案就是openfire通过org.jivesoftware.util.Blowfish.java类来实现的加解密。
在openfire的源代码中可以获取到org.jivesoftware.util.Blowfish.java,使用的是Blowfish的encryptString(String password)和decryptString(String encryptedString)两个方法执行加解密。然后单这样是无法解密的,因为还需要一个密钥passwordKey,这密钥是通过new Blowfish(String passwordKey)注入到类中。
passwordKey存在于openfire的数据库表ofproperty中,其中就有passwordKey的值,这是openfire安装时自动生成的。
如:
注入密钥后,便可以进行加解密操作。具体代码如下:
Blowfish bf = new Blowfish("r2m5aQ3d5py8Bo5");
String encryptedString = bf.decrypt("f90e8b46b1014fb696ec385e48fcabbdd425ee99e087dde8");
System.out.println(encryptedString);//will
综上,即可。