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.
[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
@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? –
Wenn Sie MD5 für etwas verwenden, das sicher sein muss, sollten Sie die Algorithmen wechseln. Was machst du eigentlich mit diesen Hashes? – Blorgbeard