Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шиврование пароля с помощью MD5 
V
    Опции темы
Cathy
Дата 14.4.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 31.3.2006

Репутация: нет
Всего: нет



пишу обычное приложение.
возникла потребность идентифицировать пользователей паролями, соответственно хранить их в бд зашифрованными.
нашла на форуме тему про шифрование с использованием MD5, где многоуважаемый LSD указал код, с помощью которого можно шифровать.

скопировала....
только возникла такая проблема:
когда я сохраняю пароль пользователя (111) - то генерируется одна шифрованная строка ( [B@18020cc )
а когда проверяю правильность ввода - то другая ( [B@750159 ) ....

почему так происходит?
PM MAIL   Вверх
LSD
Дата 14.4.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Это не шифрование, это хеширование. Разница в том, что хеширование не обратимо. Но это и не требуется.
Проверка присходит так:
  • пользователь задает пароль, ты считаешь его хеш и сохраняешь где нибудь
  • когда надо проверить пароль, ты запрашиваешь его у пользователя и вычисляешь его хеш
  • сравниваешь только что посчитанный хеш с тем который у тебя ранее сохранен
  • если совпали, то пароль верный, не совпали не верный
Код
  public static void main(String[] args) throws NoSuchAlgorithmException
  {
    byte[] password1 = getMD5("qwerty");
    byte[] password2 = getMD5("123456");
    byte[] password3 = getMD5("qwerty");
    System.out.println("password1 = password2 - " + Arrays.equals(password1, password2));
    System.out.println("password1 = password3 - " + Arrays.equals(password1, password3));
  }

  private static byte[] getMD5(String str) throws NoSuchAlgorithmException
  {
    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(str.getBytes());
    return md.digest();
  }

Пара тонких моментов, хеш это бинарные данные а не строка, поэтому делать с хешем toString(), бесполезно получишь [B@750159. Если хочешь можешь попробовать так:
Код
System.out.println(com.sun.org.apache.xerces.internal.impl.dv.util.HexBin.encode(password1));

Получишь что-то вроде:
Код
D8578EDF8458CE06FBC5BB76A58C5CA4

это хеш в шестнадцатиричном виде.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
powerOn
Дата 14.4.2006, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата

[B@18020cc


это больше похоже на преобразование Object к строке, чем на правильный вывод шифрованной строки (на экран)

Есть ли уверенность что вывод на информации на экран поизведен верно?


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Cathy
Дата 14.4.2006, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 31.3.2006

Репутация: нет
Всего: нет



а в базу как лучше записывать? в шестнадцатиричном виде?

Цитата

Есть ли уверенность что вывод на информации на экран поизведен верно?


теперь уже нету..... smile

Это сообщение отредактировал(а) Cathy - 14.4.2006, 11:30
PM MAIL   Вверх
powerOn
Дата 14.4.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



К моему предыдущему сообщению:
Такой символы можно увидеть если сделать так:

Код

 byte [] c = {1,1,1,1,1,1};
 System.out.println(c);



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 14.4.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Лучше записывать в бинарном виде, все равно работать можно только с бинарным видом. Создаешь в базе столбец byte(16) и пишешь в него.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
powerOn
Дата 14.4.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Опоздал.... smile smile


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Cathy
Дата 14.4.2006, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 31.3.2006

Репутация: нет
Всего: нет



Цитата(LSD @ 14.4.2006, 14:32)
Лучше записывать в бинарном виде, все равно работать можно только с бинарным видом. Создаешь в базе столбец byte(16) и пишешь в него.

хммм.... а у меня получилось записать шестнадцатиричное представление! и все заработало! smile

а вы советуете бинарный вид записывать в базу исходя из чего? меньше места занимает?
PM MAIL   Вверх
LSD
Дата 14.4.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(MoonCat @ 14.4.2006, 12:33 Найти цитируемый пост)
Опоздал....

Не переживай, я тоже иногда не успеваю smile

Цитата(Cathy @ 14.4.2006, 12:38 Найти цитируемый пост)
а вы советуете бинарный вид записывать в базу исходя из чего? меньше места занимает?

Не только, дело в том, что getMD5() возвращает бинарное представление, и надо будет из строквого преобразовывать в бинарное, чтобы можно было сравнить. Если надо будет писать запрос к базе, то надо будет наоборот бинарное преобразовывать в текстовое. К тому же:
Код
D8578EDF8458CE06FBC5BB76A58C5CA4
d8578edf8458ce06fbc5bb76a58c5ca4

оба эти строки обозначают один и тот же хеш, но если сравнивать их как строки то результат будет разный из-за регистра.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Cathy
Дата 18.4.2006, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 31.3.2006

Репутация: нет
Всего: нет



в java ведь есть такой метод у строк: equalsIgnoreCase().
он скажет, что приведенные Вами строки равны.

в общем, спасибо всем огромное за помощь!!!! 
PM MAIL   Вверх
LSD
Дата 18.4.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Cathy @  18.4.2006,  08:58 Найти цитируемый пост)
в java ведь есть такой метод у строк: equalsIgnoreCase().
он скажет, что приведенные Вами строки равны.

Но это еще одно преобразование. Просто выводить пользователю хеш его пароля надо не часто (даже наоборот, практически никогда). А вот сравнивать хеши между собой регулярно. Поэтому я и считаю чем меньше преобразований тем лучше smile
Но если все же решишь делать подобные преобразования, то используй не com.sun.org.apache.xerces.internal.impl.dv.util.HexBin, а какой нибудь сторонний класс, например org.apache.commons.codec.binary.Hex из Commons Codec. Т.к. этот класс могут в любой момент убрать из состава JDK или переместить в другой package.



Цитата(Cathy @  18.4.2006,  08:58 Найти цитируемый пост)
в общем, спасибо всем огромное за помощь!!!! 

Пожалуйста, заходи почаще smile  


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0792 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.