Вы не должны хранить пароли своих пользователей, даже в зашифрованном виде.Вы должны хранить только хэш / дайджест, необходимый для аутентификации.Затем вы не можете «восстановить» пароль (потому что вы его не знаете), вы можете просто сбросить его и / или дать пользователю временный одноразовый пароль, который позволит ему установить новый пароль.
Обновление : если вы выполняете вышеизложенное, стандартная процедура должна иметь форму «require-password-reset».Пользователь вводит свой идентификатор (обычно это электронная почта), и генерируется «токен» (например, случайная строка), хранится в некоторой таблице с определенной датой истечения срока действия и отправляется на его электронную почту вместе со ссылкой на «сброс пароля»форма.В этой форме токен проверяется, пользователю разрешается вводить новый пароль и получает указание попробовать новый логин.
Обновление 2 : может возникнуть небольшая проблема конфиденциальности:мы делаем, если идентификатор пользователя (электронная почта, имя пользователя или что-то еще), введенный в форму запроса, не существует в нашей базе данных?Для вывода сообщения «Пользователь не существует. Проверьте идентификатор и повторите попытку.» может быть в порядке, но в некоторых случаях это может вызвать проблему конфиденциальности: любой может проверить, зарегистрирован ли другой пользователь в вашей базе данных!Если вы хотите избежать этого, вы должны вывести то же сообщение («письмо было отправлено с инструкциями ...»), даже если пользователь не был найден (и, следовательно, письмо фактически не было отправлено).Подобные проблемы конфиденциальности рекомендуют просто выводить сообщение «неправильный вход в систему: неверный пользователь или пароль» , когда пользователь пытается войти в систему неудачно - не раскрывайте, был ли это неправильный пользователь или пароль.