Перейти к основному содержимому

Хеширование MD5 в Java

· 3 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

1. Обзор

MD5 — это широко используемая криптографическая хэш-функция, которая создает 128-битный хэш.

В этой статье мы увидим разные подходы к созданию хэшей MD5 с использованием различных библиотек Java .

2. MD5 с использованием класса MessageDigest

В классе java.security.MessageDigest есть функция хеширования . Идея состоит в том, чтобы сначала создать экземпляр MessageDigest с алгоритмом, который вы хотите использовать в качестве аргумента:

MessageDigest.getInstance(String Algorithm)

А затем продолжайте обновлять дайджест сообщения, используя функцию update() :

public void update(byte [] input)

Вышеупомянутая функция может вызываться несколько раз, когда вы, скажем, читаете длинный файл. Затем, наконец, нам нужно использовать функцию дайджеста () для генерации хэш-кода:

public byte[] digest()

Ниже приведен пример, который генерирует хэш для пароля, а затем проверяет его:

@Test
public void givenPassword_whenHashing_thenVerifying()
throws NoSuchAlgorithmException {
String hash = "35454B055CC325EA1AF2126E27707052";
String password = "ILoveJava";

MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte[] digest = md.digest();
String myHash = DatatypeConverter
.printHexBinary(digest).toUpperCase();

assertThat(myHash.equals(hash)).isTrue();
}

Точно так же мы можем также проверить контрольную сумму файла:

@Test
public void givenFile_generatingChecksum_thenVerifying()
throws NoSuchAlgorithmException, IOException {
String filename = "src/test/resources/test_md5.txt";
String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3";

MessageDigest md = MessageDigest.getInstance("MD5");
md.update(Files.readAllBytes(Paths.get(filename)));
byte[] digest = md.digest();
String myChecksum = DatatypeConverter
.printHexBinary(digest).toUpperCase();

assertThat(myChecksum.equals(checksum)).isTrue();
}

Мы должны знать, что MessageDigest не является потокобезопасным . Следовательно, мы должны использовать новый экземпляр для каждого потока.

3. MD5 с использованием Apache Commons

Класс org.apache.commons.codec.digest.DigestUtils значительно упрощает работу.

Давайте посмотрим на пример для хеширования и проверки пароля:

@Test
public void givenPassword_whenHashingUsingCommons_thenVerifying() {
String hash = "35454B055CC325EA1AF2126E27707052";
String password = "ILoveJava";

String md5Hex = DigestUtils
.md5Hex(password).toUpperCase();

assertThat(md5Hex.equals(hash)).isTrue();
}

4. MD5 с использованием гуавы

Ниже приведен еще один подход, который мы можем использовать для создания контрольных сумм MD5 с помощью com.google.common.io.Files.hash :

@Test
public void givenFile_whenChecksumUsingGuava_thenVerifying()
throws IOException {
String filename = "src/test/resources/test_md5.txt";
String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3";

HashCode hash = com.google.common.io.Files
.hash(new File(filename), Hashing.md5());
String myChecksum = hash.toString()
.toUpperCase();

assertThat(myChecksum.equals(checksum)).isTrue();
}

Обратите внимание, что Hashing.md5 устарел. Однако, как указывает официальная документация , причина скорее в том, чтобы посоветовать вообще не использовать MD5 из соображений безопасности. Это означает, что мы по-прежнему можем использовать этот метод, если нам, например, нужно интегрироваться с устаревшей системой, для которой требуется MD5. В противном случае нам лучше рассмотреть более безопасные варианты, такие как SHA-256 .

5. Вывод

В Java API и других сторонних API, таких как Apache commons и Guava, есть разные способы генерации хэша MD5. Выбирайте с умом, исходя из требований проекта и зависимостей, которым должен следовать ваш проект.

Как всегда, код доступен на Github .