2012-11-30 4 views
5

私の頭の後ろの何かが私にここで何かが分からないと言っています。MessageDigest MD5私が期待しているものを返さないアルゴリズム

私は、既存のJavaプロジェクトを、認証にapiキーのmd5ハッシュを使用するサードパーティのapiと統合しています。それは私のために働いていない、そしてデバッグ中に、私が生成しているハッシュが彼らが提供した例と一致しないことに気づいた。私はいくつかのウェブサイトで文字列からMD5ハッシュを作成してその例を確認していますが、私が間違っていると判断し、正しいと感じることができます。

たとえば、this websiteによれば、文字列 "hello"は "5d41402abc4b2a76b9719d911017c592"というハッシュを生成します。 (FWIWは、私が持っている例を正しくハッシュしているようだが、このウェブサイトについては何も知らない)。私は私のコードを介して実行すると、私は得る:

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が正しいが変換された文字列が間違っているかどうかを調べるテストがあれば、 。

+1

md.digest()には、探しているバイトが含まれている必要があります。さらにBase64アルゴリズムを使ってそれらをエンコードし、別の結果を得ます。 – hoaz

+0

httpリクエストのためにこれらのバイトをStringに変換する必要があります。 ? – eric

+1

新しい文字列(バイト[]バイト) – Andy

答えて

8

、このウェブサイトによると、文字列が「こんにちは」「5d41402abc4b2a76b9719d911017c592」のハッシュを生成します。 (FWIWは、私が持っている例を正しくハッシュしているようだが、このウェブサイトについては何も知らない)。私は私が手に私のコードを通してそれを実行すると:

XUFAKrxLKna5cZ2REBfFkgの==

両方とも同じ16バイトのハッシュを表すのが正しい方法です。 5d41402abc4b2a76b9719d911017c592は、ハッシュの各バイトを2桁の16進数で表します。一方、XUFAKrxLKna5cZ2REBfFkg==は、,のように、の3つのバイトを表すBase-64を使用します。これに

Base64.encodeBase64String(md.digest()); 

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

(主にthis StackOverflow answerから取られた)このサードパーティのAPIを期待している、あなたはこれを変更することができますことを16進バージョンを生成するために

ただし、このために外部ライブラリを使用することを検討してください。 Perceptionは、上記のコメントで、Apache Commons DigestUtilsについて言及しています。それを使用する場合はthe md5hex methodが必要になります。

+0

問題を解決し、何が起こっているのかを説明し、DigestUtils(これも機能します)を使用するPerceptionの提案を参照しているため、これを正しいとマークします。ありがとう! – eric

+0

@eric:ようこそ! – ruakh

2

md5ハッシュアルゴリズムはコアJava APIの一部なので、外部ライブラリは必要ありません。ここで私が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."; 
    } 
} 
関連する問題