我不知道这个问题是否有效。
我使用registration.jar plugin提供的igniterealtime在 openfire 服务器上注册用户。
虽然用户已注册,但存储在数据库中的密码是加密形式。是否有可能知道使用了哪种加密算法,以便我可以编写自己的登录代码?
以下是sql查询SELECT * FROM ofuser;
结果的快照,其中显示了加密密码。
加密密码: f250d7a040859d66541e2ab4a83eb2225d4fff880f7d2506
实际密码:测试人员
答案 0 :(得分:4)
如果您关心安全性,您可能希望将登录提供商甚至产品从Openfire及其内部用户提供商处转移。
Blowfish的块大小为64位
我想我们有多个块,但密码有点短。
通过粗略检查显然是散列(不加密)的长度,它似乎有24个十六进制,因此有24个半字节,等于192位。
除非哈希被截断(然后我们不确切知道),所以should be Tiger位于页面底部,为192位。
编辑:没有匹配Tiger-192,3或Tiger-192,4。无论是腌制还是虎腌制。
我会寻找来源。
编辑:它可能是Blowfish 加密,而不是哈希。看起来很奇怪,但它就在那里,
openfire_src_3_8_2.zip/openfire_src/src/java/org/jivesoftware/openfire/user/DefaultUserProfider.java
密码可以存储为纯文本,也可以使用Blowfish加密。该 加密/解密密钥存储为Openfire属性passwordKey, 这是在首次使用时自动创建的。密码密钥至关重要 创建后不能更改,否则现有密码将丢失。默认情况下 密码将以加密方式存储。可以启用纯文本密码存储 将Openfire属性
user.usePlainPassword
设置为true
。
答案 1 :(得分:3)
Openfire是开源的。不需要花太多精力来自己调查这个问题。
从here开始,您可以看到注册插件实际上并不执行添加用户的工作。它委托给UserManager
。 UserManager
个代表添加了UserProvider
的实现。
您需要确定您正在使用的用户提供程序实现,然后查看在创建用户时如何处理密码。只需看看
的实现public User createUser(String username, String password, String name, String email)
throws UserAlreadyExistsException;
这应该是显而易见的。请注意,密码是纯文本的,因此任何散列/腌制/加密都将在此点下游。
编辑:
看起来像AuthFactory
;
/**
* Returns an encrypted version of the plain-text password. Encryption is performed
* using the Blowfish algorithm. The encryption key is stored as the Jive property
* "passwordKey". If the key is not present, it will be automatically generated.
*
* @param password the plain-text password.
* @return the encrypted password.
* @throws UnsupportedOperationException if encryption/decryption is not possible;
* for example, during setup mode.
*/
public static String encryptPassword(String password) {
if (password == null) {
return null;
}
Blowfish cipher = getCipher();
if (cipher == null) {
throw new UnsupportedOperationException();
}
return cipher.encryptString(password);
}
/**
* Returns a decrypted version of the encrypted password. Encryption is performed
* using the Blowfish algorithm. The encryption key is stored as the Jive property
* "passwordKey". If the key is not present, it will be automatically generated.
*
* @param encryptedPassword the encrypted password.
* @return the encrypted password.
* @throws UnsupportedOperationException if encryption/decryption is not possible;
* for example, during setup mode.
*/
public static String decryptPassword(String encryptedPassword) {
if (encryptedPassword == null) {
return null;
}
Blowfish cipher = getCipher();
if (cipher == null) {
throw new UnsupportedOperationException();
}
return cipher.decryptString(encryptedPassword);
}