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?
Hier ist eine praktische Variante, die Folgendes verwendet InputStream.transferTo()
von Java 9, und OutputStream.nullOutputStream()
von Java 11. Sie benötigt keine externen Bibliotheken und muss nicht die gesamte Datei in den Speicher laden.
public static String hashFile(String algorithm, File f) throws IOException, NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance(algorithm);
try(BufferedInputStream in = new BufferedInputStream((new FileInputStream(f)));
DigestOutputStream out = new DigestOutputStream(OutputStream.nullOutputStream(), md)) {
in.transferTo(out);
}
String fx = "%0" + (md.getDigestLength()*2) + "x";
return String.format(fx, new BigInteger(1, md.digest()));
}
y
hashFile("SHA-512", Path.of("src", "test", "resources", "some.txt").toFile());
gibt zurück.
"e30fa2784ba15be37833d569280e2163c6f106506dfb9b07dde67a24bfb90da65c661110cf2c5c6f71185754ee5ae3fd83a5465c92f72abd888b03187229da29"
Wir haben einen Code verwendet, der dem obigen Code in einem früheren Beitrag ähnelt und
...
String signature = new BigInteger(1,md5.digest()).toString(16);
...
Achten Sie jedoch auf die Verwendung von BigInteger.toString()
hier, da es führende Nullen abschneidet... (für ein Beispiel versuchen Sie s = "27"
sollte die Prüfsumme "02e74f10e0327ad868d138f2b4fdd6f0"
)
Ich schließe mich dem Vorschlag an, Apache Commons Codec zu verwenden, ich habe unseren eigenen Code damit ersetzt.
public static String MD5Hash(String toHash) throws RuntimeException {
try{
return String.format("%032x", // produces lower case 32 char wide hexa left-padded with 0
new BigInteger(1, // handles large POSITIVE numbers
MessageDigest.getInstance("MD5").digest(toHash.getBytes())));
}
catch (NoSuchAlgorithmException e) {
// do whatever seems relevant
}
}
Sehr schnelle und saubere Java-Methode, die nicht auf externe Bibliotheken angewiesen ist:
(Ersetzen Sie MD5 einfach durch SHA-1, SHA-256, SHA-384 oder SHA-512, wenn Sie diese wünschen)
public String calcMD5() throws Exception{
byte[] buffer = new byte[8192];
MessageDigest md = MessageDigest.getInstance("MD5");
DigestInputStream dis = new DigestInputStream(new FileInputStream(new File("Path to file")), md);
try {
while (dis.read(buffer) != -1);
}finally{
dis.close();
}
byte[] bytes = md.digest();
// bytesToHex-method
char[] hexChars = new char[bytes.length * 2];
for ( int j = 0; j < bytes.length; j++ ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
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.