1

JavaでMd5チェックサムを計算する次の関数を作成しました。

class Utils {
 public static String md5Hash(String input) {
        String result = "";
        try {
            System.out.println("Input=" + input);
            final MessageDigest md = MessageDigest.getInstance("MD5");
            md.reset();
            md.update(input.getBytes());
            result = md.digest().toString();
        } catch (Exception ee) {
            System.err.println("Error computing MD5 Hash");
        }
        return result;
    }
};

複数回呼び出すUtils.md5Hash("abcde") と、異なる結果が得られます。私の理解では、md5 は文字列に対して確定的で一意のチェックサムを返します。それは間違っていますか?それ以外の場合は、実装のバグをお知らせください。ありがとう

4

3 に答える 3

7

バイト配列のtoString()メソッドは、意味のある文字列を返しません。配列オブジェクトの型を返し、その後に配列の hashCode を返します。

印刷する場合は、Hex または Base64 エンコーディングを使用して、バイト配列を文字列に変換します。Apache commons-codec には、それを行うためのメソッドがあります。

また、文字列をバイト配列に変換するために、あらゆる種類の文字をサポートする en エンコーディングを必ず指定してください。使用している方法では、プラットフォームの既定のエンコーディングが使用されます。たとえば、latin-1 であり、latin-1 以外の文字を変換している場合、これは失敗する可能性があります。UTF-8 を選択することをお勧めします。

于 2012-09-17T10:27:53.963 に答える
1

私は次の方法を使用して行いました:

 public static String encryptedLoginPassword( String password ) 
    {
        String encryptedData="";
    try{
        MessageDigest algorithm = MessageDigest.getInstance("MD5");
        byte[] defaultBytes = password.getBytes();
        algorithm.reset();
        algorithm.update(defaultBytes);
        byte messageDigest[] = algorithm.digest();

        StringBuffer hexString = new StringBuffer();
        for (int i=0;i<messageDigest.length;i++) {
            hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
        }
        encryptedData=hexString.toString();
    }catch(NoSuchAlgorithmException nsae){

    }
    return encryptedData;
    }
于 2012-09-17T10:31:38.717 に答える
0

Dinup Kandel から提供されたコードの int では、これを変更する必要がありました。

for (int i=0;i<messageDigest.length;i++) {
   hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
}

の中へ

 if ((0xff & messageDigest[i]) < 0x10) {
     hexString.append("0"
     + Integer.toHexString((0xFF & messageDigest[i])));
 } else {
     hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
 }

単体テストを機能させるために。

注:これを使用して正しい答えを確認しました:

echo -n MyTestString | md5sum
于 2015-12-24T17:12:05.043 に答える