История алгоритма MD5
MD5 — аглоритм хеширования, который позволяет генерировать ключ для индетификация определенного блока данных. Типичный пример использования алгоритма MD5: для поиска дублей каких-либо файлов на жестком диске создают MD5 каждого файла и сравнивают полученные значения. Это позволяет значительно ускорить процесс поиска, так как не нужно сравнивать содержимое каждого файла.
Также алгоритм хеширования MD5 часто используется для проверки данных, целостности и полноты скачанной с Интернета информации. Например, на торрентах некоторые файлы предоставляются со значением хеша.
Раньше MD5 использовался для хеширования паролей, но вскоре оказалось, что он является уязвимым. Наиболее частой проблемой оказалась возможность генерации одинаковых хеш-сумм для 2 сообщений, поэтому сейчас MD5 не используется в больших проектах.
Создание Java-проекта
Для начала создадим проект (для удобства я использую Maven проект) и подключим библиотеку в зависимостях нашего проекта:
1 2 3 4 5 6 7 |
<dependencies> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.9</version> </dependency> </dependencies> |
Своя реализация алгоритма MD5 на Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package ua.com.prologistic.md5; import org.apache.commons.codec.digest.DigestUtils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Example { //текст для хеширования public static final String TEXT = "Prologistic.com.ua"; public static void main(String[] args) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(TEXT.getBytes()); byte byteData[] = md.digest(); //конвертируем байт в шестнадцатеричный формат первым способом StringBuffer sb = new StringBuffer(); for (byte aByteData : byteData) { sb.append(Integer.toString((aByteData & 0xff) + 0x100, 16).substring(1)); } System.out.println("Текст в шестнадцатеричном виде : " + sb.toString()); //конвертируем байт в шестнадцатеричный формат вторым способом StringBuffer hexString = new StringBuffer(); for (byte aByteData : byteData) { String hex = Integer.toHexString(0xff & aByteData); if (hex.length() == 1) hexString.append('0'); hexString.append(hex); } System.out.println("Текст в шестнадцатеричном виде : " + hexString.toString()); } |
Результат выполнения:
1 2 |
Текст в шестнадцатеричном виде : b20af7b8040be27ae6fd2c8e2ae857ad Текст в шестнадцатеричном виде : b20af7b8040be27ae6fd2c8e2ae857ad |
Пример использования MD5 от Apache Common Codec
1 2 3 |
private static String md5ApacheExample(String text){ return DigestUtils.md5Hex(text); } |
Как видим, в утилитном классе DigestUtils есть метод md5Hex(String st), в котором содержится реализация MD5
Результат выполнения:
1 |
Используем реализацию MD5 от Apache Common Codec : b20af7b8040be27ae6fd2c8e2ae857ad |
Как видим, Apache Common Codec очень прост в использовании и освобождает нас от рутинной работы, где легко допустить ошибку.