Ich möchte Java verwenden, um die MD5-Prüfsumme einer Datei zu ermitteln. Ich war wirklich überrascht, aber ich habe nichts gefunden, das zeigt, wie man die MD5-Prüfsumme einer Datei abrufen kann.
Wie wird das gemacht?
Ich möchte Java verwenden, um die MD5-Prüfsumme einer Datei zu ermitteln. Ich war wirklich überrascht, aber ich habe nichts gefunden, das zeigt, wie man die MD5-Prüfsumme einer Datei abrufen kann.
Wie wird das gemacht?
Es gibt einen Input Stream Decorator, java.security.DigestInputStream
so dass Sie den Digest berechnen können, während Sie den Eingabestrom wie gewohnt verwenden, anstatt einen zusätzlichen Durchlauf über die Daten machen zu müssen.
MessageDigest md = MessageDigest.getInstance("MD5");
try (InputStream is = Files.newInputStream(Paths.get("file.txt"));
DigestInputStream dis = new DigestInputStream(is, md))
{
/* Read decorated stream (dis) to EOF as normal... */
}
byte[] digest = md.digest();
Utilisez DigestUtils von Apache Commons Codec Bibliothek:
try (InputStream is = Files.newInputStream(Paths.get("file.zip"))) {
String md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(is);
}
Ein Beispiel finden Sie unter Reals Java-Anleitung unter Verwendung der MessageDigest Klasse.
Auf dieser Seite finden Sie auch Beispiele für die Verwendung von CRC32 und SHA-1.
import java.io.*;
import java.security.MessageDigest;
public class MD5Checksum {
public static byte[] createChecksum(String filename) throws Exception {
InputStream fis = new FileInputStream(filename);
byte[] buffer = new byte[1024];
MessageDigest complete = MessageDigest.getInstance("MD5");
int numRead;
do {
numRead = fis.read(buffer);
if (numRead > 0) {
complete.update(buffer, 0, numRead);
}
} while (numRead != -1);
fis.close();
return complete.digest();
}
// see this How-to for a faster way to convert
// a byte array to a HEX string
public static String getMD5Checksum(String filename) throws Exception {
byte[] b = createChecksum(filename);
String result = "";
for (int i=0; i < b.length; i++) {
result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
}
return result;
}
public static void main(String args[]) {
try {
System.out.println(getMD5Checksum("apache-tomcat-5.5.17.exe"));
// output :
// 0bb2827c5eacf570b6064e24e0e6653b
// ref :
// http://www.apache.org/dist/
// tomcat/tomcat-5/v5.5.17/bin
// /apache-tomcat-5.5.17.exe.MD5
// 0bb2827c5eacf570b6064e24e0e6653b *apache-tomcat-5.5.17.exe
}
catch (Exception e) {
e.printStackTrace();
}
}
}
El com.google.common.hash API bietet:
Lesen Sie das Benutzerhandbuch ( IO Erläutert , Hashing erklärt ).
Für Ihren Anwendungsfall Files.hash()
berechnet und liefert den Digest-Wert für eine Datei.
Zum Beispiel ein sha-1 Digest-Berechnung (ändern Sie SHA-1 in MD5, um MD5 Digest zu erhalten)
HashCode hc = Files.asByteSource(file).hash(Hashing.sha1());
"SHA-1: " + hc.toString();
Beachten Sie, dass crc32 ist viel schneller als md5 also verwenden Sie crc32 wenn Sie keine kryptografisch sichere Prüfsumme benötigen. Beachten Sie auch, dass md5 sollte nicht zum Speichern von Passwörtern und ähnlichem verwendet werden, da es zu leicht zu erzwingen ist; für Passwörter verwenden Sie bcrypt , scrypt o sha-256 stattdessen.
Für den langfristigen Schutz mit Hashes wird ein Merkle-Signaturverfahren trägt zur Sicherheit bei, und die von der Europäischen Kommission geförderte Post-Quantum Cryptography Study Group hat die Verwendung dieser Kryptografie für den langfristigen Schutz gegen Quantencomputer empfohlen ( ref ).
Beachten Sie, dass crc32 hat eine höhere Kollisionsrate als die anderen.
Verwendung von nio2 (Java 7+) und keine externen Bibliotheken:
byte[] b = Files.readAllBytes(Paths.get("/path/to/file"));
byte[] hash = MessageDigest.getInstance("MD5").digest(b);
Um das Ergebnis mit einer erwarteten Prüfsumme zu vergleichen:
String expected = "2252290BC44BEAD16AA1BF89948472E8";
String actual = DatatypeConverter.printHexBinary(hash);
System.out.println(expected.equalsIgnoreCase(actual) ? "MATCH" : "NO MATCH");
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.