Прежде всего, вы не должны хранить пароли пользователей в вашей базе данных - в любом случае, не в открытом тексте.Я собираюсь решить эту проблему, прежде чем решать проблему сброса пароля, так как они подключены.
Обычный способ - преобразовать пароль, используя односторонний алгоритм хеширования с солью (см. Определение в Википедии).соли для получения дополнительной информации), а затем, когда пользователи пытаются войти, выполнить такое же шифрование и сравнить хэши.
Чтобы сделать вещи еще более сложными, попробуйте изменить соль каждого хэша.
Вот пошаговый метод, который я использую:
- Пользователь создаетпароль (через регистрационную форму)
Функция создает случайную соль, а затем шифрует пароль, в этом случае, используя алгоритм SHA256 и используя случайно созданную соль.
$password_salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
$password_hash = hash('sha256', $salt . $password);
Сохраните $ password_hash и $ password_salt в таблицу пользователей.Они будут использованы позже для аутентификации пользователя при попытке входа в будущем.
Когда пользователь входит в систему, проверьте имя пользователя / адрес электронной почты / логин и, если он найден, возьмите хэш и соль из таблицы пользователей и сравните хэш пароля из БД с возвращенным хешем.от выполнения той же функции на том, что они ввели в качестве своего пароля.
$salt = $user_record['password_salt'];
$entered_hash = hash('sha256', $salt . $entered_password);
В приведенном выше случае, если $enter_password_hash == $ user_record ['password_hash'] ($ user_record, то, что исходит из вашей базы данных), тогда пароль проверяется.
Примечание Чтобы сделать вещи более сложными, я на самом деле хранюхэш пароля и соль в том же поле в БД.Вы можете объединить их вместе, так или иначе, так что если ваша база данных скомпрометирована, поле пароля фактически бесполезно для получения пользовательских паролей.
Теперь, когда вы хотите обратиться к забытым паролям, вы можете создать случайный парольно это все равно будет отправлено пользователю по электронной почте, что не очень хорошая идея, даже для временного пароля.Я бы предложил отправить по электронной почте пользователю ссылку, по которой нужно щелкнуть, и перейти на страницу сброса пароля.Вот несколько шагов для этого процесса:
- Создайте таблицу email_authentication с двумя столбцами - ИД пользователя и ключ.Он будет содержать информацию, которая будет связывать идентификаторы пользователей со случайно сгенерированным ключом.
- Создайте страницу (например, reset.php), которая ожидает параметр URL (например, $ k), а затем ищет параметр втаблица email_authentication.Если в таблице найдена совпадающая запись, удалите ее и перенаправьте на страницу, на которой будет разрешен пароль для идентификатора пользователя в той же записи.
- Пользователь забывает свой пароль, нажимает ссылку Забыли пароль и вводитих правильный адрес электронной почты.
- Запись создается в таблице email_authentication, содержащей их ИД пользователя, и для ключа генерируется случайная строка (длиной не более 32 символов) (например: 'r4nd0mstr1ng')
- Отправьте пользователю по электронной почте ссылку настраница, созданная на шаге 2, с ключом, созданным в строке URL-адреса.(например: http://foo.com/reset.php?k=r4nd0mstr1ng
- Пользователь щелкает ссылку в сообщении электронной почты, скрипт в файле reset.php ищет «r4nd0mstr1ng» в таблице email_authentication и находит его связанным с идентификатором пользователя, и они перенаправляются в формучто позволяет им сбросить свой пароль.
- Когда пароль сброшен, не сохраняйте его открытым текстом !!
Для получения дополнительной информации (и, возможно, лучшего объяснения хеширования паролятехнику, посмотрите на Это сообщение от HeyBigName . Он основан на CodeIgniter, но содержащиеся в нем функции универсально применимы.