我不知道这个问题是否有效。
我正在使用 igniterealtime 提供的registration.jar插件在openfire服务器上注册用户。
尽管用户已注册,但存储在数据库中的密码是加密形式的。是否可以知道使用了哪种加密算法以便我可以编写自己的登录代码?
SELECT * FROM ofuser;
以下是显示加密密码的 sql 查询结果的快照。
加密密码:f250d7a040859d66541e2ab4a83eb2225d4fff880f7d2506
实际密码:tester
如果您关心安全性,您可能希望将登录提供程序甚至产品从 Openfire 及其内部用户提供程序中切换出来。
Blowfish 的块大小为 64 位
我猜我们有多个区块,虽然密码有点短。
通过粗略检查显然是哈希(不是加密)的长度,它似乎有 24 个十六进制,因此 24 个半字节,等于 192 位。
除非哈希被截断(那么我们并不确切知道),它应该是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
。
Openfire 是开源的。自己调查问题并不需要太多努力。
从这里开始,您可以看到注册插件实际上并没有完成添加用户的工作。它委托给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);
}