Вопрос-ответ

Getting a File's MD5 Checksum in Java

Получение контрольной суммы MD5 файла в Java

Я хочу использовать Java для получения контрольной суммы MD5 файла. Я был действительно удивлен, но я не смог найти ничего, что показывало бы, как получить контрольную сумму MD5 файла.

Как это делается?

Переведено автоматически
Ответ 1

Существует декоратор входного потока, java.security.DigestInputStream так что вы можете вычислять дайджест, используя входной поток, как обычно, вместо того, чтобы выполнять дополнительный переход по данным.

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();
Ответ 2

Используйте DigestUtils из библиотеки кодеков Apache Commons:

try (InputStream is = Files.newInputStream(Paths.get("file.zip"))) {
String md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(is);
}
Ответ 3

В Real's Java-How-to есть пример использования класса MessageDigest.

Проверьте эту страницу, чтобы найти примеры использования CRC32 и 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();
}
}
}
Ответ 4

API com.google.common.hash предлагает:


  • Унифицированный удобный API для всех хэш-функций

  • Доступные 32- и 128-разрядные реализации murmur3

  • адаптеры md5(), sha1(), sha256(), sha512 (), измените только одну строку кода для переключения между ними и выполните murmur.

  • goodFastHash (биты int), когда вам все равно, какой алгоритм вы используете

  • Общие утилиты для экземпляров хэш-кода, такие как combineOrdered / combineUnordered

Прочитайте руководство пользователя (объяснен ввод-вывод, объяснено хеширование).

Для вашего варианта использования Files.hash() вычисляет и возвращает итоговое значение для файла.

Например, вычисление дайджеста (измените SHA-1 на MD5, чтобы получить дайджест MD5)

HashCode hc = Files.asByteSource(file).hash(Hashing.sha1());
"SHA-1: " + hc.toString();

Обратите внимание, что намного быстрее, чем , поэтому используйте , если вам не нужна криптографически безопасная контрольная сумма. Обратите также внимание, что не следует использовать для хранения паролей и т.п., поскольку его легко взломать, для паролей используйте , или вместо этого.

Для долгосрочной защиты с помощью хэшей схема подписи Merkle повышает безопасность, и Исследовательская группа по постквантовой криптографии, спонсируемая Европейской комиссией, рекомендовала использовать эту криптографию для долгосрочной защиты от квантовых компьютеров (ссылка).

Обратите внимание, что у частота столкновений выше, чем у других.

java