MD5-хэшированный пароль необратим. (MD5 хэширует, а не шифрует, так что есть небольшая разница). И да вы определенно захотите предоставить процесс сброса пароля (а не просто отправить пароль по электронной почте).
Чтобы обеспечить высокий уровень рабочего процесса для безопасного сброса пароля ...
- Когда пользователь просит сбросить свой пароль, заставьте его ввести свой адрес электронной почты
- Не указывайте, был ли этот адрес электронной почты действительным или нет (просто скажите им, что письмо было отправлено). Это открыто для обсуждения, так как снижает удобство использования (т. Е. Я понятия не имею, на какое письмо я зарегистрировался), но предлагает меньше информации людям, пытающимся собрать информацию о том, какие письма действительно зарегистрированы на вашем сайте.
- Сгенерируйте токен (возможно, хэшируйте временную метку с солью) и сохраните ее в базе данных в записи пользователя.
- Отправьте электронное письмо пользователю вместе со ссылкой на страницу сброса http s (токен и адрес электронной почты в URL).
- Используйте токен и адрес электронной почты для подтверждения пользователя.
- Пусть они выберут новый пароль, заменив старый.
- Кроме того, хорошей идеей является истечение срока действия этих токенов через определенный промежуток времени, обычно через 24 часа.
- При желании запишите, сколько «забытых» попыток произошло, и, возможно, реализуйте более сложные функции, если люди запрашивают тонну писем.
- При желании запишите (в отдельной таблице) IP-адрес лица, запрашивающего сброс. Увеличьте счет с этого IP. Если оно когда-нибудь достигнет более, чем, скажем, 10 ... Игнорируйте их будущие запросы.
Чтобы немного подробнее рассказать о хешировании ...
Когда вы хэшируете значение, такое как пароль, с помощью функции md5 () в PHP, окончательное значение для этого пароля будет одинаковым, независимо от того, на каком сервере вы его запускаете. (Таким образом, есть одно различие, которое мы можем сразу увидеть между хешированием и шифрованием ... В этом нет никакого личного / открытого ключа).
Здесь вы увидите, как люди упоминают об уязвимости к радужным таблицам . Очень простое объяснение радужной таблицы ... Вы md5 () хешируете несколько слов в словаре (слабые пароли), чтобы получить их хэшированные значения md5 (). Поместите их в таблицу базы данных (радужную таблицу).
Теперь, если вы скомпрометировали базу данных веб-сайта, вы можете запустить хешированные пароли пользователей к вашей радужной таблице, чтобы (по сути) «перевернуть» хэш обратно к паролю. (Вы на самом деле не «меняете» хеш… Но вы поняли).
Вот где лучше всего "солить" ваши пароли. Это означает (опять же, очень простая идея здесь), что вы добавляете случайное значение к паролям пользователей до того, как вы его хешируете. Теперь, когда радужная таблица запускается для вашей базы данных, ее не так просто «перевернуть», поскольку хэш md5 () «password» отличается от «password384746».
Вот хорошая SO Q / A, которая должна помочь. Безопасный хеш и соль для паролей PHP