2009-06-29 12 views
1

私はJavaとphp5のMD5-Hashesに関連する奇妙な問題に直面しています。私はここでパスワードがPHP5 MD5に に格納されている既存のユーザ・データベースを移行しなければならなかったJavaとphp5の違いMD5ハッシュ

public static String getMD5Hash(String string) 
{ 
    try 
    { 
     MessageDigest md5 = MessageDigest.getInstance("MD5"); 
     md5.update(string.getBytes()); 
     byte[] digest = md5.digest(); 

     string = byteArrToHexString(digest); 
    } 
    catch (NoSuchAlgorithmException e1) 
    { 
     e1.printStackTrace(); 
    } 

    return string; 
} 

private static String byteArrToHexString(byte[] bArr) 
{ 
    StringBuffer sb = new StringBuffer(); 

    for (int i = 0; i < bArr.length; i++) 
    { 
     int unsigned = bArr[i] & 0xff; 
     sb.append(Integer.toHexString((unsigned))); 
    } 

    return sb.toString(); 
} 

: 私はウンター特定の状況には、次のコードが正しいMD5ハッシュを生成しない ないことを考え出しました。 Javaコード が正しいMD5ハッシュを生成しないため、一部のユーザーはログインできません。

上記の問題は何ですか?

答えて

10

byteArrToHexStringが正しくバイト<の0x10を変換しません、あなたはゼロでパッドそれらをする必要があります。

例:MD5は自分自身を、パスワードをハッシュ化して...私はちょうど問題が発生したとても面白い

int unsigned = bArr[i] & 0xff; 
if (unsigned < 0x10) 
    sb.append("0"); 
sb.append(Integer.toHexString((unsigned))); 
+0

私にそれを打つ:P素敵な仕事 –

+0

Sry、その1つのスニペットを教えてもらえますか?私は恐れています。 –

+0

パディングの例を追加するように編集しました。 – laalto

0

あなたが不足している:

md5.reset(); 

update()を実行する前に

チェックJava md5 example with MessageDigest

+4

は問題べきではありません。同じオブジェクトを何度も何度も繰り返し使用していた場合は、リセットする必要があります。 – laalto

+0

これを追加しましたが、結果はありません。とにかくThx! –

1

。私の場合の問題は、元のパスワードをbyte[]にエンコードすることでした。私は

md5.update(string.getBytes("UTF-8")); 

に上記の以前のパスワードをハッシュするために使用されたエンコーディング正確を見つけるためにあなたに助言し、コードの変更ライン6

は(もちろん、これは単なる一例です。.. 。正しい文字集合をパラメータとして使用するかどうかを調べる)

ところで、私はあなたの理由があると思うが、なぜハッシュ法を使ってはいけないのだろうか?

return new String(digest, "UTF-8"); 

新しいするMessageDigestオブジェクトを毎回作成されているためのYuval = 8)

関連する問題