Я понимаю, что для обеспечения безопасности пароли не должны храниться в БД в виде открытого текста. Если я их использую, я могу проверить их для целей входа.
Но если я хочу создать систему восстановления пароля, какая лучшая стратегия, так как нет никакого уничтожения хэширования?
Может ли кто-нибудь дать мне краткий обзор хорошей и безопасной стратегии хранения и восстановления паролей?
Вы не можете восстановить пароль, который был хэширован, и вы тоже.
Вместо этого вы должны:
Вы не восстанавливаете пароли. Что вы делаете, это одна из двух вещей.
Мой процесс выглядит следующим образом.
Пользователь нажимает ссылку на забытый пароль и затем перенаправляется на форму сброса пароля, где им предлагается ввести свой зарегистрированный адрес электронной почты.
После того, как пользователь ввел свой адрес электронной почты, система проверяет, существует ли в базе данных. Если адрес электронной почты действителен, маркер генерируется и сохраняется в базе данных с учетными данными пользователей.
Электронная почта отправляется на зарегистрированный адрес электронной почты, содержащий ссылку на форму сброса, ссылка включает в себя 2 параметра GET, включая токен и уникальный идентификатор пользователей, хранящийся в базе данных.
После того, как пользователь нажимает на ссылку, они переходят в форму сброса. Система извлекает 2 параметра GET из URL-адреса и проверяет их существование в базе данных. Если токен проверен на существование в базе данных с пользователем, тогда пользователю могут быть указаны поля формы сброса пароля, чтобы ввести новый пароль.
Я предлагаю использовать BCrypt (доступный начиная с PHP 5.3) для хеширования паролей и для дополнительной безопасности, возможно, для своего токена использовать какое-то истечение, чтобы он не мог использоваться через некоторое время.
Вы можете создать новый (и случайно сгенерированный) пароль для пользователя и md5, а затем отправить пользователя по электронной почте.