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

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

1. обзор

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

В этой статье мы увидим, как будут выглядеть различные подходы кcreate MD5 hashes using various Java libraries.

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();
}

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

Классorg.apache.commons.codec.digest.DigestUtils значительно упрощает работу по сравнению с описанными выше операциями, которые мы выполняли с помощью классаMessageDigest.

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

@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 с использованием Guava

Ниже приведен еще один более простой подход для генерации контрольных сумм 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();
}

5. Заключение

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

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