2

我不知道这个问题是否有效。

我正在使用 igniterealtime 提供的registration.jar插件在openfire服务器上注册用户。

尽管用户已注册,但存储在数据库中的密码是加密形式的。是否可以知道使用了哪种加密算法以便我可以编写自己的登录代码

SELECT * FROM ofuser;以下是显示加密密码的 sql 查询结果的快照。

在此处输入图像描述

加密密码:f250d7a040859d66541e2ab4a83eb2225d4fff880f7d2506

实际密码:tester

4

2 回答 2

4

它是河豚,甚至不是哈希。

如果您关心安全性,您可能希望将登录提供程序甚至产品从 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

于 2013-08-15T11:58:52.610 回答
3

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);
   }
于 2013-08-15T12:25:20.857 回答