2012-11-30 3 views
5

Etwas in meinem Hinterkopf sagt mir, dass ich etwas offensichtlich hier vermisse.MessageDigest MD5 Algorithmus gibt nicht zurück, was ich erwarte

Ich integriere ein vorhandenes Java-Projekt mit einer API von Drittanbietern, die einen MD5-Hash eines API-Schlüssels für die Authentifizierung verwendet. Es funktioniert nicht für mich, und beim Debuggen wurde mir klar, dass die erzeugten Hashes nicht mit den Beispielen übereinstimmen, die sie geliefert haben. Ich habe einige Websites gefunden, die MD5-Hashes aus Strings erstellen, um ihre Beispiele zu überprüfen, und soweit ich das beurteilen kann, liege ich falsch und sie haben Recht.

zum Beispiel, nach erzeugt die Zeichenfolge "Hallo" einen Hash von "5d41402abc4b2a76b9719d911017c592". (FWIW Ich weiß nichts über diese Website, außer dass sie die Beispiele, die ich habe, richtig zu hacken scheint). Wenn ich es durch meinen Code ausführen ich:

XUFAKrxLKna5cZ2REBfFkg ==

Hier ist die einfache Methode ist, ich bin mit dem MD5-Hash/string zu erzeugen .:

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()); 
} 

benutzte ich einen sehr ähnliche Methode zur erfolgreichen Authentifizierung einer anderen API unter Verwendung des SHA1-Algorithmus letzte Woche. Ich frage mich, ob das Problem mit der org.apache.commons.net.util.Base64.encodeBase64String ... Jede Hilfe wird sehr geschätzt, wenn nur einige Tests zu sehen, ob das ByteArray korrekt ist, aber die konvertierte Zeichenfolge falsch ist .

+1

md.digest() sollte Bytes enthalten, die Sie suchen, Sie codieren sie weiter mit Base64-Algorithmus und erhalten unterschiedliches Ergebnis – hoaz

+0

Ich muss diese Bytes in einen String für eine HTTP-Anfrage konvertieren, gibt es eine bessere Möglichkeit, das zu tun ? – eric

+1

new String (byte [] bytes) – Andy

Antwort

8

beispielsweise entsprechend dieser Website, die Zeichenfolge "Hallo" erzeugt einen Hash-Wert von "5d41402abc4b2a76b9719d911017c592". (FWIW Ich weiß nichts über diese Website, außer dass sie die Beispiele, die ich habe, richtig zu hacken scheint). Wenn ich es durch meinen Code ausführen ich:

XUFAKrxLKna5cZ2REBfFkg ==

Beide sind Hash richtige Art und Weise der Darstellung der gleichen sechzehn Byte. 5d41402abc4b2a76b9719d911017c592 stellt jedes Byte des Hash als zwei hexadezimale Ziffern dar, während XUFAKrxLKna5cZ2REBfFkg== Base-64 verwendet, um alle drei Bytes des Hash als vier Zeichen darzustellen.

Base64.encodeBase64String(md.digest()); 

dazu:

Um die hexadezimalen-Version zu erzeugen, dass dieser Drittanbieter-API erwarten ist, können Sie dies ändern

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

(meist aus this StackOverflow answer genommen).

Sie könnten jedoch in Betracht ziehen, eine externe Bibliothek dafür zu verwenden. Perception erwähnt in einem Kommentar oben Apache Commons DigestUtils. Wenn Sie das verwenden, möchten Sie the md5hex method.

+0

Dies als richtig zu markieren, da es mein Problem löst, erklärt, was zur Hölle passiert, und verweist auf Perceptions Vorschlag, DigestUtils zu verwenden (was auch funktioniert). Vielen Dank! – eric

+0

@eric: Gern geschehen! – ruakh

2

Der md5-Hash-Algorithmus ist Teil der Core-Java-API, so dass keine externen Bibliotheken benötigt werden. Hier ist die Methode, die ich verwendet habe, um ein Passwort mit MD5 zu verschlüsseln.

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."; 
    } 
}