0

JDBC を使用してランプを接続しています。MySQL データベースで MD5 を使用してハッシュされたパスワードとしてLondonWeightという単語があります。次に、入力されたパスワードをコレクションに対してチェックする必要があります。つまり、LondonWeightが一致するかどうかをチェックします。ただし、私の Java コードのハッシュは、単語に対して異なる出力を返します。

MySQL ハッシュ: 1274d1c52d7a5a9125bd64f1f9a26dce

Java ハッシュ: 132310771724320562704545645352563257040366

これが私のハッシュコードです:

private String hashPass(String pass) throws NoSuchAlgorithmException {
    MessageDigest mdEnc = MessageDigest.getInstance("MD5"); 
    mdEnc.update(pass.getBytes(), 0, pass.length());
    String md5 = new BigInteger(1, mdEnc.digest()).toString(8); // Encrypted 
    return md5;
}

テキストボックスに入力された文字列は、端末に出力されているため、確認できるように確実にハッシュされます。なぜそれが異なる出力を与えるのか考えていますか? バイトなどをハッシュする別の方法があることを理解していますか?

4

1 に答える 1

7

現在、Java でハッシュを 8 進数に変換していますが、MySQL のバージョンは 16 進数です。

それが最初の問題ですが、次の点もあります。

  • MySQL ハッシュは33文字のようです。これは 16 進数の MD5 ハッシュにはデータが多すぎます。そこでは奇妙なことが起こっています。
  • BigIntegerとにかく、バイト配列を16進数に変換するために使用しません。それはそこにあるものではありません。Apache Commons Codec または16 進変換用に設計されたものを使用します。たとえば、そのようにして、BigInteger抑制される可能性のある適切な先行ゼロを取得します
  • 現在のコードは、1 文字あたり 1 バイトを想定しています
  • 現在のコードは、デフォルトの文字エンコーディングが適切であると想定しています。常にエンコーディングを指定することをお勧めしますString.getBytes
  • パスワードハッシュに MD5 を使用するのは脆弱です。可能であれば、より適切なハッシュに更新してください
于 2013-06-21T12:15:33.560 に答える