2017-01-10 6 views
1

Ich fand eine Lösung für dieses Problem here.Generieren eines MD5-Hash von einem char []

private byte[] toBytes(char[] chars) { 
    CharBuffer charBuffer = CharBuffer.wrap(chars); 
    ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(charBuffer); 
    byte[] bytes = Arrays.copyOfRange(byteBuffer.array(), 
      byteBuffer.position(), byteBuffer.limit()); 
    Arrays.fill(charBuffer.array(), '\u0000'); // clear sensitive data 
    Arrays.fill(byteBuffer.array(), (byte) 0); // clear sensitive data 
    return bytes; 
} 

char[] stringChars = "String".toCharArray(); 
byte[] stringBytes = toBytes(stringChars); 

MessageDigest md = MessageDigest.getInstance("MD5"); 
md.update(stringBytes); 
String stringHash = new BigInteger(1, md.digest()).toString(16); 

Arrays.fill(stringChars, '\u0000'); 
Arrays.fill(stringBytes, (byte) 0); 

Aber es scheint einen Fehler zu haben, ich kann nicht herausfinden, wo oder wie es passiert.

Das Problem ist, dieser Teil denke ich:

String hashedPass = new BigInteger(1, md.digest()).toString(16); 

Die Ausgabe des obigen Code gibt für String:

String = "9a9cce201b492954f0b06abb081d0bb4"; 
Correct MD5 of above string = "0e67b8eb546c322eeb39153714162ceb", 
The code above though gives = "e67b8eb546c322eeb39153714162ceb"; 

Es scheint führende Nullen eines MD5 fehlen.

+0

[Diese Antwort] (http://stackoverflow.com/a/421696/369) schlägt vor, einfach mit dem linken Auffüllen mit Nullen - ich weiß nicht, ob es eine bessere Lösung ist. – Blorgbeard

+0

@Blorgbeard Vielen Dank, dass Sie diesen Beitrag verlinkt haben, er scheint eine Menge verschiedener (funktionierender) Lösungen für das Problem zu haben. Ist einer sicherer als der andere? –

+3

Wenn Sie MD5 für etwas verwenden, das sicher sein muss, sollten Sie die Algorithmen wechseln. Was machst du eigentlich mit diesen Hashes? – Blorgbeard

Antwort

4

Sie müssen BigInteger für diese Aufgabe nicht verwenden, schreiben Sie einfach eine Methode zum Konvertieren von Byte-Arrays in Hex-Strings.

static String hexEncode(byte [] data) { 
    StringBuilder hex = new StringBuilder(); 
    for (byte b : data) hex.append(String.format("%02x", b)); 
    return hex.toString(); 
} 

String hash = hexEncode(md.digest()); 
+0

Vielen Dank! Ich habe das jetzt benutzt: StringBuffer sb = new StringBuffer(); for (Byte b: Digest) {sb.append (String.format ("% 02x", b & 0xff));} Dies behebt auch das führende Null-Problem. Nicht sicher, wie man Code in diesen Kommentaren verwendet ... das ist wirklich nervig. –

Verwandte Themen