MD5 пример использования в Java

Вам нужно зашифровать пароль либо другие данные, в таком случае можно использовать MD5 шифрование.

MD5 (Message Digest 5) — 128-битный алгоритм хеширования, разработанный профессором Рональдом Л. Ривестом в 1991 году. Предназначен для создания «отпечатков» или дайджестов сообщения произвольной длины и последующей проверки их подлинности.

Для приведения примеров я создал класс MD5Util.java в котором реализую два метода генерации MD5.

 

Метод #1: Собственная реализация

Ниже приведен пример реализации:

public static String md5Custom(String st) {
    MessageDigest messageDigest = null;
    byte[] digest = new byte[0];

    try {
        messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.reset();
        messageDigest.update(st.getBytes());
        digest = messageDigest.digest();
    } catch (NoSuchAlgorithmException e) {
        // тут можно обработать ошибку
        // возникает она если в передаваемый алгоритм в getInstance(,,,) не существует
        e.printStackTrace();
    }

    BigInteger bigInt = new BigInteger(1, digest);
    String md5Hex = bigInt.toString(16);

    while( md5Hex.length() < 32 ){
        md5Hex = "0" + md5Hex;
    }

    return md5Hex;
}

Хеш содержит 128 бит (16 байт) поэтому мы в строке 17 указали 16 байтов, в строке 19 было указанно 32 так как обычно хеш 16 байтов представляется как последовательность из 32 шестнадцатеричных цифр.

 

Метод #2: Apache Common Codec

Этот метод заключается в использовании готовой реализации MD5.

Для того чтобы использовать реализацию Apache Common Codec нужно подключить его к проекту. Если использовать Maven то нужно подключить к вашему проекту зависимость:

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.9</version>
</dependency>

И ниже пример использования:

public static String md5Apache(String st) {
    String md5Hex = DigestUtils.md5Hex(st);

    return md5Hex;
}

DigestUtils — это утильный класс позволяющий зашифровать данные в MD5 и другие типы шифрования.

 

Использование

Вызов методов утильного класса MD5Util.java  со строкой devcolibri:

public static void main(String[] args) {
    String st = "devcolibri";

    System.out.println("Custom MD5:");
    System.out.println(MD5Util.md5Custom(st));
    System.out.println("Apache MD5:");
    System.out.println(MD5Util.md5Apache(st));
}

Результат:

Custom MD5:
4fa25efdd84d2e2c9f206980d4ccfff1
Apache MD5:
4fa25efdd84d2e2c9f206980d4ccfff1
Урок создан: 01 июля 2014 | Просмотров: 31101 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 01 июля 2014 в 00:29

    alex

    а почему не указал в обратную сторону , т.е. как расшифровать md5 например , если хранить пароли пользователей в базе

    • 01 июля 2014 в 00:33

      Александр Барчук

      Потому что расшифровать md5 возможно, но это очень и очень трудоемкий процесс. Но если хранить пароль в БД и вы хотите сравнить их, то расшифровывать пароль не надо нужно просто второй не зашифрованный зашифровать и сравнить их.

      • 01 июля 2014 в 05:04

        Сергей

        На данный момент расшифровать MD5 уже совершенно не трудоемкий процесс, будет ли туториал по современным методам хеширования?

        • 01 июля 2014 в 10:21

          Александр Барчук

          Ну тогда может продепонстрируете этот не трудоемкий процесс? :)

        • 08 июля 2014 в 22:49

          Стас

          Хеш-сумму, полученную с помощью любого метода хеширования (не важно, MD5 это, или какой-нибудь SHA1) расшифровать невозможно, и не будет никогда возможно. Начнём с того, что MD5 это не шифрование вообще, а всего лишь хеш-сумма. Хеш можно взять с любого объёма данных. Представьте, у нас есть файл размером 50Гб, мы берём с него хеш-сумму и получаем 32-байтовую строку (в обычном MD5). Получается, что мы сжали данные объёмом в 53687091200 байт всего до 32. Вы сами-то в этом верите?

    • 07 июля 2014 в 02:55

      Игорь

      Дело не в трудоемкости, а в безопасности. Не стоит хранить в бд пароли юзеров, т.к их могут украсть. Храни хеши, и сравнивай хеши….

      • 07 июля 2014 в 21:51

        Александр Барчук

        А я и не говорил что нужно хранить пароль, сам MD5 расшифровать трудоемко по ресурсам и времени.

        • 10 июля 2014 в 14:48

          Игорь

          Александр, есть правильные вопросы, а есть неправильные. Alex задал неправильный вопрос, который говорит, что он не совсем понимает тему, про которую задает вопрос. И вместо того, что бы отвечать на его некомпетентный вопрос, наверно лучше сказать, что он изначально неправильно видит ситуацию.
          1) Например то, что md5 служит для именно для одностороннего преобразования, а значит декодирование в принципе не для этого алгоритма….
          2) Ну и второе, человек рассуждает о хранении паролей в БД….вместо того, что бы намекнуть о изначально неправильном подходе, Вы подогреваете его неверные рассуждения.
          При этом, я всего-лишь хотел поправить его вектор мыслей…. :)

          Да, вероятно такие вопросы идут из-за не очень продуманного введения к статье. Практики много, теории ноль, что в итоге ведет к непониманию и оторванности решения от постановки задачи.

  • 01 июля 2014 в 22:43

    alex

    александр, спасибо за ответ, именно это я и имел ввиду.

  • 21 декабря 2015 в 14:35

    dobro

    Почему-то мд5 хэш пароля, который я сохраняю в базе, и мд5 хэш вводимого пароля не совпадают. Хотя хэши создаются с помощью скопированного отсюда метода №1. Пароли одинаковые, ибо даже если не вводить пароль, всё равно тоже самое — хэши не совпадают… Такие вот дела.

    • 21 декабря 2015 в 15:38

      dobro

      Впрочем, мой косяк был, пардон :)

  • 21 декабря 2015 в 15:15

    dobro

    Объясните толком, зачем туда нули приписывать? В МД5 же строго 32 символа, разве нет?

    • 30 июня 2016 в 21:01

      GoToCoding

      Ну изи же догнать, не? Если размер хеша меньше 32 символов, то приписываем к нему «0», чтобы хеш стал длиной 32.

  • 04 января 2017 в 23:31

    Raven

    Я так понимаю, в методе #1 описан не сам алгоритм, а его просто откуда-то берут?