sorry_i_noob
@sorry_i_noob

Статья на хабре про хеширование паролей. Непонятны некоторые моменты. Поможете разобраться?

Здравствуйте. Разбираюсь вот с этой статьей:
https://habr.com/post/210760/
После прочтения возникло несколько вопросов.

1) При хешировании пароля нужно брать случайную соль? А при проверке делать цикл - хешировать проверяемый пароль через все соли из БД и проверять - не совпал ли хеш с тем, что в БД, верно?
3) Сколько должно быть солей в БД?
4) Если я случайно буду выбирать соль из БД все же может получиться так, что у пользователей с одинаковым паролем будет одинаковый хеш пароля? ведь случайность может быть выпасть на ту же самую соль. Разве это нормально?

5) Можно ли этот способ использовать для создания пароля / токена (чтобы восстановить пароль / подтвердить почтовый ящик)? Или это делает уязвимость для сайта? Вроде глупый вопрос, но в той же статье на хабре написано вот что:
Сразу определю какую задачу применения хешей буду рассматривать — аутентификация пользователей. Не токены восстановления паролей, не аутентификация запросов, не что-то еще. Это также не статья про защиту канала передачи данных, так что комментарии по challenge-response и SSL неуместны!
  • Вопрос задан
  • 255 просмотров
Решения вопроса 1
Tyranron
@Tyranron
Отвечали уже не раз. Советую внимательно ознакомиться.

Также, на том же Хабре, есть более свежие вменяемы статьи:
Про хранение паролей в БД (обязательно читать комменты)
Правильные ответы по криптографии: 2018 год

Непосредственно по Вашим вопросам:

1. При создании хэша пароля генерировать случайную соль. Сохранять в БД хэш + соль. При проверке пароля выбирать из БД хэш + соль, хэшировать полученный пароль с солью, и сопоставлять результат с хэшом из БД.

3. Для каждого хранимого хэша пароля своя уникальная соль.

4. Соль генерируется достаточно случайной, потому что она должна быть сложно угадываемой. Это означает, что энтропия для этого дела берется достаточно большая, и Вы можете не переживать за то, что чисто теоретически у Вас может сгенерироваться 2 одинаковые соли. Вероятность подобного случая примерно сравнимая с вероятностью того, что все молекулы воздуха в Вашей комнате возьмут и соберутся в одном углу, то есть, крайне мала(с). И даже если Вы спустите весь запас удачи своей жизни на такой воистину уникальный случай, то ничего страшного и непоправимого при этом не случится - ну поймёт злоумышленник, что конкретно у этих 2х пользователей одинаковый пароль, ну и всё на этом, - пароли то всё ещё надо взламывать.

5. Да, можно. Хотя задача хэширования паролей и задача восстановления доступа по токену - это 2 разные задачи, с разными дано и целями, но первая задача является частью второй, ибо Вам нужно хранить в БД отпечаток секрета пользователя (коим временный токен восстановления и является). Алгоритм простой: генерируем случайный временный токен восстановления -> пишем в БД его отпечаток (хэш + соль) и время жизни -> отправляем токен пользователю -> пользователь переходит по ссылке с токеном -> проверяем валидность токена по его отпечатку и времени жизни -> заставляем пользователя ввести новый пароль. По сути, токен восстановления и являет собой одноразовый временный пароль, который предоставляет доступ для установки постоянного пароля.

Ну и традиционный совет: используйте для получения отпечатков секретов пользователей рекомендуемые алгоритмы (Argon2, Bcrypt, scrypt, и т.п.), а не собственные реализации. Там всё сделано под капотом как надо, ибо нюансов своих в этом деле тоже хватает (стоимость по времени, стоимость по памяти, constant time сравнения, и т.д.).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sim3x
@sim3x
1. Нет. Соль можно хранить рядом с хешем в таблице
Можно использовать единую для всех паролей соль, но очень длинную
Если не достаточно, то можно присоединять к соли неизменяемый параметр учетной записи пользователя типа даты создания
3. Или все, или ниодной
4. Соль не случайна. Соль (или часть соли) однозначно привязана к записи пользователя
5. Проще использовать связку UUID + email пользователя с сохранением UUID в записи пользователя и проверкой ее

Автор статьи перебдел, тк видимо сам является безопасником
Уточню, что статья довольно старая и скорости перебора хешей лучше не принимать на веру
Ответ написан
Jump
@Jump
Системный администратор со стажем.
Соль нужна для исключения подбора пароля по таблице.
Ее задача увеличить длину пароля, чтобы исключить вероятность нахождения его в таблице.
Хэш для пароля qwerty и для пароля 3fg%S c довольно высокой вероятностью найдется в таблице.
Если к этим паролям присобачить соль вроде - "ijlkhUoiUUGy;iu*&^t89uJbYF&^98HnbTtfjbkjbVhgcjnjbhjvtftbjb", то в таблице ее хэша гарантированно не будет.

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

Соль не является секретной информацией, нет никакой необходимости в ее защите.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы