1

認証とユーザー管理のためにSpring LDAPでApache DSを使用しています。Apache DS はパスワード フィールドをハッシュされたバイト配列として送信するため、それを文字列に復号化する必要があります。MD5ハッシュを使用しています。

たとえば、Apache DS Studio を使用してパスワードを入力するために使用されるウィンドウは次のとおりです。

(デモンストレーションのために、入力したパスワードが1であることを伝えたいと思います)

ここに画像の説明を入力

Apache DS はパスワード フィールドをハッシュされたバイト配列として送信します。以下のように Spring LDAP を使用して取得しようとすると、[B@66ca6254 . 私はそれを復号化する必要があり、上記のようにc4ca4238a0b923820dcc509a6f75849bである 16 進値を取得しました。

4

2 に答える 2

3

ここには2つの問題があります。

  • 「復号化」という用語は、実際に元のパスワードを復元できたかのように使用しています。そうではありません。うまくいけば、あなたはこれをすでに理解していて、単に「復号化」という用語を不適切に使用しているだけです
  • toString()バイト配列を呼び出しています。これが値「[B@66ca6254」を与えているものです。これは、呼び出しているオブジェクトがバイト配列であり、次にハッシュであることを示しています。実際に関心があるのは、バイト配列の16進表現です。

基本的には、バイト配列を16進文字列に変換する必要があります。これを行うには、独自のコードで、またはApache CommonsCodeやそのHexクラスなどのサードパーティライブラリを使用して、さまざまな方法があります。追加のライブラリを含めたくない場合は、ここのように、StackOverflowでバイト配列から16進文字列に変換するためのコードスニペットがたくさんあります。(これもありますが、個人的には一般的な変換には使用したくありません。XML固有のタイプのような匂いがします。問題なく動作するので、コードに間違った印象を与えるだけです。)javax.xml.bind.DataTypeConverter

編集:取得しているバイト数を指定したので、16進数を使用するだけでは不十分です。のASCIIエンコード形式が与えられました。これは"{MD5}xMpCOKC5I4INzFCab3WEmw=="、それ自体がMD5であり、base64エンコードバージョンであることを示しています。したがって、次のことを行う必要があります。

  • を使用してバイト配列を文字列に変換しますnew String(data, "ASCII")
  • 文字列がで始まることを確認します"{MD5}"
  • 文字列の残りの部分をbase64としてデコードします(つまり、最初の5文字を​​削除してから、残りをbase64デコードで実行します)。繰り返しになりますが、これにはApache Commonsコーデック、またはこのパブリックドメインbase64デコーダー(または他の多くのソリューション)を使用できます。
  • その時点で、ハッシュの実際の生のバイナリデータが得られます。次に、前に説明したように、必要に応じてそれを16進数に変換できます。
于 2012-12-09T08:21:11.760 に答える
0

MD5 ハッシュを復号化することはできません。これは一方向ハッシュ関数です。

于 2012-12-09T08:19:51.167 に答える