Ich habe bemerkt, dass viele meiner Google-Suchen mich hierher geführt haben, also dachte ich, ich könnte mir vielleicht Ihre treffenden Gedanken ausleihen :)
Im Rahmen meiner Dissertation im dritten Studienjahr arbeite ich an einem Generator für ein Einmalpasswort für ein mobiles Gerät (sowie für eine Website zum Einloggen).
Mit der org.bouncycastle.crypto.digests.MD5Digest Bibliothek nehme ich ein Byte-Array (aus einer Zeichenfolge Benutzereingabe) dann Hashing es X Anzahl von Zeiten. Dies ist auch als Daisy-Chaining Hash-Strings oder Lamports Methode der Verschlüsselung bekannt.
Mein Problem ist, dass, wenn die Zeichenfolge einmal gehasht wird, dann es richtig hasht es, jedoch wenn der neue Hash erneut gehasht wird das Ergebnis falsch ist.
Siehe Code unten:
private String generateHash(String OTP, int loopNum)
{
byte[] secretBytes = OTP.getBytes();
for (int x = 0; x < loopNum; x++)
{
byte[] tempStore = new byte[16];
tempStore = hash(secretBytes);
secretBytes = tempStore;
}
return convertToHex(secretBytes);
}
public byte[] hash(byte[] secretBytes)
{
org.bouncycastle.crypto.digests.MD5Digest digest = new org.bouncycastle.crypto.digests.MD5Digest();
digest.reset();
// Update MD5 digest with user secret in byte format
digest.update(secretBytes, 0, secretBytes.length);
// get length of digest to initialise new md5 byte array
int length = digest.getDigestSize();
// create md5 byte array using length
byte[] md5 = new byte[length];
// calculate MD5 hash, using md5 byte array, 0 for buffer offset
digest.doFinal(md5, 0);
return md5;
}
private static String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
String Hex;
String formattedHex;
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] <<< 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9))
buf.append((char) ('0' + halfbyte));
else
buf.append((char) ('a'+ (halfbyte - 10)));
halfbyte = data[i] & 0x0F;
} while(two_halfs++ < 1);
}
Hex = buf.toString();
formattedHex = "\n" + Hex.substring(0, 4) + " " + Hex.substring(4, 8) + " " + Hex.substring(8, 12) + " "
+ Hex.substring(12, 16) + " " + Hex.substring(16, 20) + " " +Hex.substring(20, 24) + " "
+ Hex.substring(24, 28) + " " + Hex.substring(28, 32);
return formattedHex;
}
Ich denke, es ist entweder;
- Der Digest gibt kein korrektes Byte-Array zurück
- Der Hex-Konverter konvertiert dies fälschlicherweise
Ich teste mit dem Geheimnis von: A das die folgenden MD5-Ausgaben hat:
- 7fc56270e7a70fa81a5935b72eacbe29
- 8f28f2e7231860115d2a8cacba019dbe (dies sollte 4cbd6d53280de25e04712c7434a70642 sein)
Vielen Dank für Ihre Hilfe im Voraus :)
p.s. Ich überprüfe es gegen ein PHP md5 könnte dies auch ein Problem sein?