8

頭の後ろにある何かが、ここで明らかな何かが欠けていると私に言っています。

既存のJavaプロジェクトを、認証にAPIキーのmd5ハッシュを使用するサードパーティのAPIと統合しています。それは私にとってはうまくいきません、そしてデバッグ中に私が生成しているハッシュが彼らが提供した例と一致しないことに気づきました。例を確認するために文字列からMD5ハッシュを作成するWebサイトをいくつか見つけました。私が知る限り、私は間違っていて、正しいと言えます。

たとえば、このWebサイトによると、文字列「hello」は「5d41402abc4b2a76b9719d911017c592」のハッシュを生成します。(FWIW私が持っている例を正しくハッシュしているように見えることを除いて、このWebサイトについては何も知りません)。コードを実行すると、次のようになります。

XUFAKrxLKna5cZ2REBfFkg ==

これが、md5ハッシュ/文字列を生成するために使用している簡単な方法です。

private String md5(String md5Me) throws Exception {
    MessageDigest md = MessageDigest.getInstance("MD5");
    md.reset();
    md.update(md5Me.getBytes("UTF-8"));

    return Base64.encodeBase64String(md.digest());
}

先週、SHA1アルゴリズムを使用して別のAPIを正常に認証するために、非常によく似た方法を使用しました。問題がorg.apache.commons.net.util.Base64.encodeBase64Stringに関連しているかどうか疑問に思っています...byteArrayが正しいかどうかを確認するためのいくつかのテストだけで、変換された文字列が間違っている場合は、助けていただければ幸いです。 。

4

2 に答える 2

9

たとえば、このWebサイトによると、文字列「hello」は「5d41402abc4b2a76b9719d911017c592」のハッシュを生成します。(FWIW私が持っている例を正しくハッシュしているように見えることを除いて、このWebサイトについては何も知りません)。コードを実行すると、次のようになります。

XUFAKrxLKna5cZ2REBfFkg ==

どちらも同じ16バイトのハッシュを表す正しい方法です。5d41402abc4b2a76b9719d911017c592ハッシュの各バイトを2桁の16進数で表しますが、 XUFAKrxLKna5cZ2REBfFkg==Base-64を使用してハッシュの3バイトごとを4文字で表します。

このサードパーティAPIが期待する16進バージョンを生成するには、次のように変更できます。

Base64.encodeBase64String(md.digest());

これに:

String.format("%032x", new BigInteger(1, md.digest()));

(主にこのStackOverflowの回答から取得)。

ただし、これには外部ライブラリの使用を検討することをお勧めします。知覚は、上記のコメントで、ApacheCommonsDigestUtilsに言及しています。それを使用する場合はmd5hexメソッドが必要になります。

于 2012-11-30T19:42:31.443 に答える
3

md5ハッシュアルゴリズムはコアJavaAPIの一部であるため、外部ライブラリは必要ありません。これが、MD5でパスワードを暗号化するために使用した方法です。

import java.security.MessageDigest;

/**
 * Use to encrypt passwords using MD5 algorithm
 * @param password should be a plain text password.
 * @return a hex String that results from encrypting the given password.
 */
public static String encryptPassword(String password) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(password.getBytes());

        byte byteData[] = md.digest();

        StringBuffer hexString = new StringBuffer();
        for (int i=0;i<byteData.length;i++) {
            String hex=Integer.toHexString(0xff & byteData[i]);
            if(hex.length()==1) hexString.append('0');
            hexString.append(hex);
        }
        return hexString.toString();
    }
    catch(java.security.NoSuchAlgorithmException missing) {
        return "Error.";
    }
}
于 2012-11-30T19:41:35.960 に答える