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

Java MD5 Пример хеширования

В этой статье используется дайджест сообщений Java и кодек Apache Commons для генерации хэш-значения MD5 из строки и файла (контрольная сумма)

MD5 , определенный в RFC 1321 , представляет собой алгоритм хэширования для преобразования входных данных в фиксированную 128-битную (16 байт) длину хэш-значения.

Примечание MD5 не устойчив к столкновениям – два разных входа могут выдавать одно и то же значение хэша. Прочтите это Уязвимости MD5 . Существует множество быстрых и безопасных алгоритмов хеширования, таких как SHA 3-256 или BLAKE2 ; Для хэширования паролей мы можем использовать Bcrypt или Аргон2 . Если возможно, не используйте MD5 ни в каких задачах криптографии, связанных с безопасностью.

В Java мы можем использовать Дайджест сообщений для генерации алгоритма MD5 .

  MessageDigest md = MessageDigest.getInstance("MD5");
  byte[] result = md.digest(input);

1. Хэширование Java MD5

В этом примере Java используется MD5 для получения хэш-значения из строки.

package com.mkyong.crypto.hash;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {

    private static final Charset UTF_8 = StandardCharsets.UTF_8;
    private static final String OUTPUT_FORMAT = "%-20s:%s";

    private static byte[] digest(byte[] input) {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalArgumentException(e);
        }
        byte[] result = md.digest(input);
        return result;
    }

    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static void main(String[] args) {

        String pText = "Hello MD5";
        System.out.println(String.format(OUTPUT_FORMAT, "Input (string)", pText));
        System.out.println(String.format(OUTPUT_FORMAT, "Input (length)", pText.length()));

        byte[] md5InBytes = MD5Utils.digest(pText.getBytes(UTF_8));
        System.out.println(String.format(OUTPUT_FORMAT, "MD5 (hex) ", bytesToHex(md5InBytes)));
        // fixed length, 16 bytes, 128 bits.
        System.out.println(String.format(OUTPUT_FORMAT, "MD5 (length)", md5InBytes.length));

    }

}

Выход

Input (string)      :Hello MD5
Input (length)      :9
MD5 (hex)           :e5dadf6524624f79c3127e247f04b548
MD5 (length)        :16

Попробуйте другую строку, например, Привет MD5 Привет MD5 . Длина ввода варьируется, но выходное значение хэша MD5 по-прежнему составляет 128 бит, 16 байт.

Выход

Input (string)      :Hello MD5 Hello MD5
Input (length)      :19
MD5 (hex)           :6219b1bc3542949e012616059409f1cc
MD5 (length)        :16

2. Контрольная сумма файла Java MD5.

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

Вот текстовый файл.

Hello MD5

Эта Java-программа сгенерирует контрольную сумму файла MD5 из файла.

package com.mkyong.crypto.hash;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Utils {

    private static final Charset UTF_8 = StandardCharsets.UTF_8;
    private static final String OUTPUT_FORMAT = "%-20s:%s";

    private static byte[] checksum(String filePath) {

        MessageDigest md;
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalArgumentException(e);
        }

        try (InputStream is = new FileInputStream(filePath);
             DigestInputStream dis = new DigestInputStream(is, md)) {
            while (dis.read() != -1) ; //empty loop to clear the data
            md = dis.getMessageDigest();
        } catch (IOException e) {
            throw new IllegalArgumentException(e);
        }
        return md.digest();

    }

    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static void main(String[] args) {

        String file = "c:\\test\\readme.txt";
        System.out.println(String.format(OUTPUT_FORMAT, "Input (file) ", file));
        System.out.println(String.format(OUTPUT_FORMAT, "MD5 (checksum hex) ", bytesToHex(checksum(file))));

    }

}

Выход

Input (file)        :c:\test\readme.txt
MD5 (checksum hex)  :e5dadf6524624f79c3127e247f04b548

3. Кодек Apache Commons

В этом примере используется библиотека commons-codec для генерации хэш-значения MD5.

  
      commons-codec
      commons-codec
      1.14
  

3.1 Хэш-значение MD5 из строки.

import org.apache.commons.codec.digest.DigestUtils;

    String pText = "Hello MD5";
    System.out.println(DigestUtils.md5Hex(password));

Выход

e5dadf6524624f79c3127e247f04b548

3.2 Значение хэша MD5 из файла.

  try (InputStream is = new FileInputStream("c:\\test\\readme.txt")) {
      String checksum = DigestUtils.md5Hex(is);
      System.out.println(checksum);
  } catch (IOException e) {
      e.printStackTrace();
  }

Выход

e5dadf6524624f79c3127e247f04b548

Скачать Исходный Код

$клон git $клон git

$cd java-крипто

Рекомендации

Оригинал: “https://mkyong.com/java/java-md5-hashing-example/”