2015-03-21 5 views
0

Я сделал экран входа в систему и хочу проверить пароль, который клиент вводит с паролями в базе данных сервера. Если их HashCodes совпадают, пароль принимается. Тем не менее, HashCode, который я получаю, когда я пишу пароль на экране клиента, отличается от HashCode полученной строки (пароля) на стороне сервера.Разное hashCode для той же строки?

Кто-нибудь знает почему? Заранее благодарим за понимание.

+2

Вы неправильно поняли. Вы не используете 'hashCode()' для этого, вы должны использовать безопасный хеш, и вы должны получать базу данных для хэширования и сравнения. – EJP

+0

Если два (вне коробки) объектов равны, их хэш-коды также будут. Таким образом, если вы видите неравные хэш-коды, соответствующие строки также не равны. Невозможно рассказать, как вы дошли до этого момента, не видя кода. В любом случае, как упоминает @EJP, вы не должны тестировать пароли таким образом. –

+0

Получается ли сервер, получающий ту же строку, которую отправляет клиент? – immibis

ответ

0

Вы неправильно поняли.

  1. Вы должны использовать безопасный хэш, а не метод hashCode().
  2. Вы не должны хранить пароль открытого текста в базе данных. Вы должны сохранить хэш.
  3. Вы должны получить базу данных, чтобы сделать хеширования и сравнения:

    SELECT COUNT(*) FROM USERS WHERE USERNAME = ? AND PASSWORD = MD5(?) 
    

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

+0

Что не так с хэшированием приложения? (на стороне сервера) – immibis

+0

@immibis Не так много в распределении функциональных возможностей, которые могут быть в SQL. – EJP

+0

SQL способен генерировать HTML; не означает, что это хорошая идея. – immibis

0

@EJP указал (правильно), что вы должны использовать безопасный хэш-функции не Java hashCode для этого.

Однако HashCode, который я получаю, когда я пишу пароль на экране клиента, отличается от HashCode полученной строки (пароля) на стороне сервера.

Это головоломка. Если вы используете String.hashCode(), единственное возможное объяснение заключается в том, что вы хешируете разные строки; например в одном, а не в другом, может быть ведущее/конечное белое пространство, или, может быть, один хэшируется с добавленным «семенем». Я думаю, еще одно возможное объяснение может заключаться в том, что вы хешируете StringBuffer, StringBuilder, char[] или что-то еще.