Рубрики
Без рубрики

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

Быстрая запись покажет вам, как справиться с хэшированием MD5 в Java.

Автор оригинала: baeldung.

1. Обзор

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

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

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

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

MessageDigest.getInstance(String Algorithm)

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

public void update(byte [] input)

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

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 делает вещи намного проще.

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

@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.хэш :

@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 .