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 .