Я делаю модуль, который позволяет пользователям сбрасывать пароль. Я заметил, что большинство веб-сайтов предоставляют ссылку для подтверждения, содержащую строку запроса с уникальным хешем.
У меня вопрос: как я могу генерировать этот уникальный хэш каждый раз, когда один и тот же пользовательский запрос забыл пароль? Следует ли мне хранить этот хеш в базе данных и использовать его для проверки позже? Будет ли это безопасно? Или я должен создать какой-то алгоритм, который генерирует одноразовый пароль? Как я могу сгенерировать OTP?
Простое использование некоторой хеш-функции с идентификатором пользователя, солью пользователя (вы солите пароль пользователя, верно?) И псевдослучайными данными должно быть в порядке:
$ pwd_reset_hash = hash ('sha256 ', $ user_id. $ user_salt, uniqid ("", true));
Сохранить его в БД (вместе с временем запроса) как ключ сброса для этого пользователя
user_id pwd_reset_hash time_requested
===========================================
123 ae12a45232... 2010-08-24 18:05
Когда пользователь пытается его использовать, проверьте, что хэш соответствует пользователю и что время было недавним (например, «код сброса действителен в течение 3 часов» или что-то в этом роде)
удалите его из БД, когда он используется или истек
На самом деле нужно сгенерировать какой-то случайный объект и сохранить его в базе данных. Как только пароль будет изменен, вы удалите соответствующую запись из таблицы, чтобы ссылку нельзя было использовать снова.
Как уже было сказано в других ответах, выполнение SHA1 или MD5 идентификатора пользователя в сочетании с microtime и некоторой строкой соли обычно является безопасной ставкой.
1) Чтобы сгенерировать уникальный хэш, смешайте текущее время, идентификатор пользователя и немного соли (текста). Например, если ваш сайт - mysite.com, используйте этот код:
$hash = md5(time() . $userid . 'mysite');
Это создаст хороший хеш.
2) Да, сохранить в базе данных.
3) Да, если срок действия хэша истечет через фиксированный период времени, он будет в безопасности.
4) Нет, создание одноразового пароля обычно раздражает пользователей.
Да, вам следует
Похоже, существует много путаницы с генерацией токена сброса (или как бы вы его ни называли). Пожалуйста, прочитайте ответ, на который я ссылаюсь, и не изобретайте колесо с хэшами и слабыми семенами.