我可以知道使用的加密算法,以便我可以编写自己的登录代码吗?

时间:2013-08-15 11:47:34

标签: java encryption openfire

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

我使用registration.jar plugin提供的igniterealtime openfire 服务器上注册用户。

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

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

enter image description here

加密密码: f250d7a040859d66541e2ab4a83eb2225d4fff880f7d2506

实际密码:测试人员

2 个答案:

答案 0 :(得分:4)

它是Blowfish,甚至不是哈希。

如果您关心安全性,您可能希望将登录提供商甚至产品从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开始,您可以看到注册插件实际上并不执行添加用户的工作。它委托给UserManagerUserManager个代表添加了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);
   }