MySQL - Как реализовать хеширование паролей на стороне сервера

Я создаю базу данных, и мне нужно хранить пароли пользователей. Я уже использую bcrypt для хеширования паролей на стороне клиента, но я читал, что только хеширование на стороне клиента делает хеш практически эквивалентным паролю в отношении базы данных. Я хотел бы снова хэшировать пароли (которые теперь являются хешами), прежде чем они будут сохранены в базе данных. Должен ли я использовать собственный метод MySQL, например SHA2(pwd), или есть способ использовать bcrypt на сервере?


person silvertiger    schedule 17.03.2017    source источник


Ответы (1)


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

Что вам нужно сделать, так это безопасно передать пароль, например, по HTTPS, и хэшировать его там, на уровне вашего приложения. Сам по себе MySQL не имеет функций, необходимых для правильного хеширования паролей. SHA2 совершенно неадекватен, это по замыслу высокоскоростной хэш, что сразу делает его непригодным. Алгоритмы хеширования паролей намеренно медленные, чтобы сделать перебор паролей очень дорогим.

person tadman    schedule 17.03.2017
comment
Я выполняю хеширование на клиенте, потому что прочитал, что это хорошая практика для защиты от атак MITM. Но на самом деле мой вопрос именно в том, что вы говорите. Как реализовать bcrypt на стороне сервера? Я бы хотел избежать SHA2, если это вообще возможно. - person silvertiger; 19.03.2017
comment
Я не знаю, где вы это читаете, и правильно ли вы прочитали. Единственный раз, когда я видел хеширование на стороне клиента, - это системы типа запрос-ответ, и большинство из них перестали работать, потому что SSL / TLS сделал его бессмысленным, сам канал можно защитить. Хешируйте один раз правильно, и все будет в порядке. Ключевым моментом здесь является bcrypt, scrypt или любой другой алгоритм хеширования для конкретного пароля, особенно с регулируемой сложностью. - person tadman; 19.03.2017
comment
MySQL не может выполнять bcrypt, по крайней мере, из коробки. Обычно это случай, когда вы хешируете свои пароли на каком-то уровне приложения. Это может быть Java, Python, Ruby, Node.js, PHP, неважно, практически у каждого есть какая-то реализация bcrypt. MySQL, как и многие RDBM, - это просто хранилище данных. - person tadman; 19.03.2017