2

私は例を試しています:

String hashAlgorithm ="sha-256"
...
md=MessageDigest.getInstance(hashAlgorithm);
byte[] enteredPasswordDigest = md.digest(policy.getPassword().getBytes());
if (!MessageDigest.isEqual(enteredPasswordDigest, realPassword.getBytes())) {
    ...
}

ただし、ハッシュされたパスワードはデータベースに文字列として保存されます。その比較を行うと、失敗します。デバッグすると、enteredPasswordDigest長さは 32 バイトで、長さrealPassword.getBytes()は 64 バイトです。

私は何を取りこぼしたか?

4

3 に答える 3

1

単に、

  • 入力したパスワードを取得し、ハッシュ/ダイジェストします
  • byte[]を文字列に変換します
  • その文字列をDBのハッシュ済みパスワード文字列と比較します

これを試して、

String hashedStr = new String(enteredPasswordDigest);
if (!hashedStr.equals(realPassword)) {
  ...
} else {
  ...
}

ドキュメント: String.getBytes()

この文字列をデフォルトの文字セットでエンコードできない場合のこのメソッドの動作は規定されていません。このjava.nio.charset.CharsetEncoder クラスは、エンコーディング プロセスをより詳細に制御する必要がある場合に使用する必要があります。

于 2012-06-08T09:37:53.733 に答える
0

私はその点で私の質問を解決しました: Hashed password as a string at database is "hex" . それが要点です。入力したパスワードのバイト配列ダイジェストの 16 進数を取得しました。次に、16 進値を持つ文字列を比較しました。

于 2012-06-11T05:24:46.680 に答える
0

realPassword が文字列であると仮定すると、問題は Java 文字列が UTF16、つまり 1 文字あたり 2 バイトであることにある可能性があります。両方のバイト配列を印刷して、何が起こっているかをよりよく理解してください。

于 2012-06-08T09:36:12.417 に答える