2

この質問が有効かどうかはわかりません。

igniterealtimeが提供するregistration.jar プラグインを使用して、 openfireサーバーにユーザーを登録しています。

ユーザーは登録されますが、データベースに保存されるパスワードは暗号化された形式です。独自のサインイン コードを作成できるように、どの暗号化アルゴリズムが使用されているかを知ることはできますか?

SELECT * FROM ofuser;以下は、暗号化されたパスワードを示すSQL クエリの結果のスナップショットです。

ここに画像の説明を入力

暗号化されたパスワード: f250d7a040859d66541e2ab4a83eb2225d4fff880f7d2506

実際のパスワード: tester

4

2 に答える 2

4

それはフグであり、ハッシュでさえありません。

セキュリティに関心がある場合は、ログイン プロバイダーまたは製品を Openfire およびその内部ユーザー プロバイダーから切り離すことをお勧めします。

Blowfish のブロック サイズは 64 ビットです

パスワードはやや短いですが、複数のブロックがあると思います。

明らかにハッシュ (暗号化ではない) の長さを大雑把に調べると、24 hexits、つまり 24 ニブル (192 ビットに相当) があるように見えます。

ハッシュが切り捨てられていない限り (正確にはわかりません)、ページの下部にある 192 ビットの Tiger である必要があります。

編集: 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 に答える