Gibt es eine Methode, um einen MD5-Hash einer Zeichenkette in Java zu erzeugen?
Könnten Sie mich auf einige Quellen verweisen, in denen ich die relativen Vorzüge und Schwächen der einzelnen Produkte nachlesen kann?
Gibt es eine Methode, um einen MD5-Hash einer Zeichenkette in Java zu erzeugen?
Sie können Folgendes versuchen. Details und Download-Codes finden Sie hier: http://jkssweetlife.com/java-hashgenerator-md5-sha-1/
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Example {
public static void main(String[] args) throws Exception {
final String inputString = "Hello MD5";
System.out.println("MD5 hex for '" + inputString + "' :");
System.out.println(getMD5Hex(inputString));
}
public static String getMD5Hex(final String inputString) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(inputString.getBytes());
byte[] digest = md.digest();
return convertByteToHex(digest);
}
private static String convertByteToHex(byte[] byteData) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
}
Die Antwort von Bombe ist richtig. Beachten Sie jedoch, dass SHA1 die bessere Wahl ist, es sei denn, Sie müssen unbedingt MD5 verwenden (z. B. wenn Sie aus Gründen der Interoperabilität dazu gezwungen werden), da MD5 bei langfristiger Verwendung Schwächen aufweist.
Ich sollte hinzufügen, dass SHA1 auch theoretische Schwachstellen hat, die aber nicht so schwerwiegend sind. Der aktuelle Stand der Technik beim Hashing ist, dass es eine Reihe von Kandidaten für Ersatz-Hash-Funktionen gibt, aber noch keine als Standard-Best-Practice zum Ersatz von SHA1 aufgetaucht ist. Je nach Ihren Bedürfnissen wären Sie also gut beraten, Ihren Hash-Algorithmus konfigurierbar zu machen, damit er in Zukunft ersetzt werden kann.
Könnten Sie mich auf einige Quellen verweisen, in denen ich die relativen Vorzüge und Schwächen der einzelnen Produkte nachlesen kann?
Das Beste, was Sie im Moment tun können, ist SHA1 zu verwenden und darauf vorbereitet zu sein, es in Zukunft zu ersetzen. Sie könnten neuere Funktionen verwenden, aber diese sind noch nicht Gegenstand umfangreicher Untersuchungen. Sie könnten Online-Sicherheitsressourcen verfolgen, um herauszufinden, wann sich dies ändert - zum Beispiel den Blog von Bruce Schneier.
SHA1 ist ein Overkill, es sei denn, Sie wollen einen kryptografisch sicheren Hash, d. h. Sie wollen weder, dass der Hash bei der Rekonstruktion der ursprünglichen Nachricht hilft, noch wollen Sie, dass ein cleverer Angreifer eine andere Nachricht erstellt, die mit dem Hash übereinstimmt. Wenn das Original nicht geheim ist und der Hash nicht zur Sicherheit verwendet wird, ist MD5 schnell und einfach. Das Google Web Toolkit verwendet beispielsweise MD5-Hashes in JavaScript-URLs (z. B. foo.js?hash=12345).
Eine weitere Umsetzung: Schnelle MD5-Implementierung in Java
String hash = MD5.asHex(MD5.getHash(new File(filename)));
Ich fand es sehr nützlich. Sie benötigte 15357 ms für eine 4,57 GB große Datei, während die Java-eigene Implementierung 19094 ms benötigte.
Ich weiß nicht, ob dies für irgendjemanden, der dies liest, relevant ist, aber ich hatte gerade das Problem, dass ich
Ich wollte es nur mit JRE-Klassen machen (keine Apache Commons oder ähnliches). Eine schnelle Websuche zeigte mir keine Beispielcode-Schnipsel, die beide zur gleichen Zeit, sondern nur jede Aufgabe einzeln. Da dies erfordert, die gleiche Datei zweimal zu lesen, dachte ich, es könnte sich lohnen, einen Code zu schreiben, der beide Aufgaben vereint und die Prüfsumme während des Herunterladens der Datei berechnet. Dies ist mein Ergebnis (entschuldigen Sie, wenn es nicht perfektes Java ist, aber ich denke, Sie verstehen die Idee trotzdem):
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.security.DigestOutputStream; // new
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
void downloadFile(String fromURL, String toFile, BigInteger md5)
throws IOException, NoSuchAlgorithmException
{
ReadableByteChannel in = Channels.newChannel(new URL(fromURL).openStream());
MessageDigest md5Digest = MessageDigest.getInstance("MD5");
WritableByteChannel out = Channels.newChannel(
//new FileOutputStream(toFile)); // old
new DigestOutputStream(new FileOutputStream(toFile), md5Digest)); // new
ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); // 1 MB
while (in.read(buffer) != -1) {
buffer.flip();
//md5Digest.update(buffer.asReadOnlyBuffer()); // old
out.write(buffer);
buffer.clear();
}
BigInteger md5Actual = new BigInteger(1, md5Digest.digest());
if (! md5Actual.equals(md5))
throw new RuntimeException(
"MD5 mismatch for file " + toFile +
": expected " + md5.toString(16) +
", got " + md5Actual.toString(16)
);
}
Übrigens, bevor jemand außer mir merkt, wie schlecht meine JRE-Kenntnisse wirklich sind: Ich habe gerade entdeckt DigestInputStream et DigestOutputStream . Ich werde meine ursprüngliche Lösung ändern, um dem Rechnung zu tragen, was ich gerade gelernt habe.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
2 Stimmen
stackoverflow.com/questions/304268/
46 Stimmen
MD5 mag als einseitiges Sicherheitsmerkmal unsicher sein, aber für allgemeine Prüfsummenanwendungen ist es immer noch gut geeignet.