MD5 хеширане в Java

Java Top

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

1. Общ преглед

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

В тази статия ще видим различни подходи за създаване на MD5 хешове с помощта на различни Java библиотеки .

2. MD5 Използване на клас MessageDigest

В клас java.security.MessageDigest има функционалност за хеширане . Идеята е първо да създадете екземпляр на 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(); }

Трябва да сме наясно, че 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.

Дъно на Java

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА