Храните в моей БД хешированные пароли, а не исходные пароли, верно? так как мне использовать BCrypt.Net.BCrypt?

Каждый раз, когда я использую:

BCrypt.HashPassword(password, 12)

это дает мне другой результат. Из того, что я прочитал, чтобы проверить данные для входа, у меня должен быть сам пароль:

BCrypt.Verify(expectedPassword , hashed);

Так что я в замешательстве: я думал, что должен хранить в своей БД только хэши, а не сами пароли. Что мне не хватает?


person Tar    schedule 02.09.2013    source источник
comment
Пользователь вводит пароль. Затем вы хэшируете их и сравниваете шифрование (либо напрямую, либо с помощью BCrypt.Verify().   -  person Adrian Wragg    schedule 02.09.2013
comment
@AdrianWragg, тогда у меня должен быть сам пароль на сервере?   -  person Tar    schedule 02.09.2013
comment
@Heslacher: это имеет значение?   -  person Tar    schedule 02.09.2013
comment
@Tal Нет, вы никогда не должны хранить пароль, если пользователи входят в вашу систему. Пользователь предоставляет простой текстовый пароль каждый раз, когда входит в систему, затем вы хэшируете его и сравниваете с сохраненным хэшем.   -  person Adrian Wragg    schedule 02.09.2013
comment
@AdrianWragg, так что же такое expectedPassword в моем вопросе?   -  person Tar    schedule 02.09.2013
comment
@Tal Не зная источника этого кода, я могу только догадываться, что это текстовый пароль, предоставленный пользователем. См. также stackoverflow.com/questions/11654684/verifying-a-bcrypt- хеш   -  person Adrian Wragg    schedule 02.09.2013
comment
давайте продолжим это обсуждение в чате   -  person Tar    schedule 02.09.2013
comment
@Heslacher: почему это важно? Я имею в виду, я думаю, что BCrypt.HashPassword(password, 12) создает соль внутри, не так ли?   -  person Tar    schedule 02.09.2013


Ответы (2)


Вы правы на 100%, когда утверждаете:

Я думал, что должен хранить в своей БД только хэши, а не сами пароли.

В соответствии с нашим онлайн-чатом, где мы разъяснили проблему, о которой вы спрашивали, общий процесс выглядит следующим образом:

  • В процессе создания (или изменения) пароля пароль в виде обычного текста поступает в систему в виде открытого текста.
  • Затем он хешируется в памяти.
  • Затем это значение хеш-функции сохраняется в базе данных.

Позже ...

  • Когда пользователь хочет пройти аутентификацию, он вводит свой пароль.
  • Этот пароль поступает в систему в виде обычного текста.
  • Затем он хешируется в памяти.
  • Затем это хеш-значение сравнивается с предыдущим хэшем, сохраненным в пароле.

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

Стандартно разрешить паролю быть в виде обычного текста, когда он все еще находится в памяти. Теоретически возможно зашифровать его до того, как он попадет на сервер (например, меня не удивит, если существуют процедуры SHA-512, написанные на JavaScript для хеширования паролей перед их отправкой), но это, как правило, выходит за рамки даже самые сложные требования безопасности.

person Adrian Wragg    schedule 02.09.2013

В коде

BCrypt.Verify (ожидаемый пароль, хэш);

Вы используете имя «ожидаемый пароль», и мне интересно, указывает ли это на ваше неправильное представление. Это не тот пароль, который вы ожидаете от пользователя. Это простой текстовый пароль, который они пытаются использовать для входа в систему.

второй параметр, hashed, представляет собой хешированное значение их «официального» пароля (то есть пароля, с которым они зарегистрировались).

Таким образом, «хэш» хранится в базе данных. «expectedPassword» — это пароль, который они только что ввели для входа в систему. Вы не сохраняете его.

person user2735420    schedule 02.09.2013
comment
Верно, я его не храню, но он проходит по проводам/сети: пользователь передает его на сервер, сервер получает этот пароль. Это то, что меня смутило - я наивно думал, что пароли, которые я набираю, никогда не попадают на другую сторону (хранятся в БД или просто волатильны) - person Tar; 02.09.2013
comment
В идеале вы должны отправить текстовый пароль через безопасное соединение, такое как shttp или ssl. - person user2735420; 05.09.2013
comment
Если это невозможно, вы должны хэшировать пароль перед его отправкой. Я не знаю, предоставляет ли BCrypt функции для этого. Он должен был бы предоставить доступ к соли на стороне клиента, чтобы вы могли солить и хэшировать. Если это не поддерживается, вы можете использовать другие инструменты, но для этого вам может потребоваться вручную создать значение соли и сохранить его в базе данных. (Не такая уж большая проблема, но больше работы.) На стороне клиента потребуется способ восстановить соль и использовать тот же алгоритм хэширования, что и на стороне сервера. - person user2735420; 05.09.2013