Вам нужно зашифровать пароль либо другие данные, в таком случае можно использовать 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
ПОХОЖИЕ ПУБЛИКАЦИИ
- None Found
21 комментариев к статье "MD5 пример использования в Java"
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
а почему не указал в обратную сторону , т.е. как расшифровать md5 например , если хранить пароли пользователей в базе
Потому что расшифровать md5 возможно, но это очень и очень трудоемкий процесс. Но если хранить пароль в БД и вы хотите сравнить их, то расшифровывать пароль не надо нужно просто второй не зашифрованный зашифровать и сравнить их.
На данный момент расшифровать MD5 уже совершенно не трудоемкий процесс, будет ли туториал по современным методам хеширования?
Ну тогда может продепонстрируете этот не трудоемкий процесс? :)
Хеш-сумму, полученную с помощью любого метода хеширования (не важно, MD5 это, или какой-нибудь SHA1) расшифровать невозможно, и не будет никогда возможно. Начнём с того, что MD5 это не шифрование вообще, а всего лишь хеш-сумма. Хеш можно взять с любого объёма данных. Представьте, у нас есть файл размером 50Гб, мы берём с него хеш-сумму и получаем 32-байтовую строку (в обычном MD5). Получается, что мы сжали данные объёмом в 53687091200 байт всего до 32. Вы сами-то в этом верите?
Есть радужные таблицы.
Дело не в трудоемкости, а в безопасности. Не стоит хранить в бд пароли юзеров, т.к их могут украсть. Храни хеши, и сравнивай хеши….
А я и не говорил что нужно хранить пароль, сам MD5 расшифровать трудоемко по ресурсам и времени.
Александр, есть правильные вопросы, а есть неправильные. Alex задал неправильный вопрос, который говорит, что он не совсем понимает тему, про которую задает вопрос. И вместо того, что бы отвечать на его некомпетентный вопрос, наверно лучше сказать, что он изначально неправильно видит ситуацию.
1) Например то, что md5 служит для именно для одностороннего преобразования, а значит декодирование в принципе не для этого алгоритма….
2) Ну и второе, человек рассуждает о хранении паролей в БД….вместо того, что бы намекнуть о изначально неправильном подходе, Вы подогреваете его неверные рассуждения.
При этом, я всего-лишь хотел поправить его вектор мыслей…. :)
Да, вероятно такие вопросы идут из-за не очень продуманного введения к статье. Практики много, теории ноль, что в итоге ведет к непониманию и оторванности решения от постановки задачи.
В статье же не сря метка NOTE стоит :) Это тип заметки, который не подразумевает детальное описание всего. Но вас я понял, учту)
MD5 хэши крайне не надежны и поиск коллизии занимает копеечное время
Можете привести пример хотя бы 10 таких коллизий?
https://ru.wikipedia.org/wiki/MD5#.D0.9A.D1.80.D0.B8.D0.BF.D1.82.D0.BE.D0.B0.D0.BD.D0.B0.D0.BB.D0.B8.D0.B7 – весьма подробно расписаны варианты поиска коллизий
александр, спасибо за ответ, именно это я и имел ввиду.
Почему-то мд5 хэш пароля, который я сохраняю в базе, и мд5 хэш вводимого пароля не совпадают. Хотя хэши создаются с помощью скопированного отсюда метода №1. Пароли одинаковые, ибо даже если не вводить пароль, всё равно тоже самое – хэши не совпадают… Такие вот дела.
Впрочем, мой косяк был, пардон :)
Объясните толком, зачем туда нули приписывать? В МД5 же строго 32 символа, разве нет?
Ну изи же догнать, не? Если размер хеша меньше 32 символов, то приписываем к нему “0”, чтобы хеш стал длиной 32.
Я так понимаю, в методе #1 описан не сам алгоритм, а его просто откуда-то берут?
MD5 не является алгоритмом шифрования
Число 16 в 17-му рядку – це не байти, а radix.