Я делаю модуль, который позволяет пользователям сбросить пароль. Я заметил, как большинство сайтов предоставляют ссылку подтверждения, которая содержит строку запроса, которая имеет уникальный хеш.
Мой вопрос: как я могу генерировать этот уникальный хэш каждый раз, когда тот же запрос пользователя забыли пароль? Должен ли я хранить этот хэш в базе данных и использовать его для проверки позже? Будет ли это безопасно? Или я должен создать какой-то алгоритм, который генерирует одноразовый пароль? Как я могу создать 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) Нет, генерация одноразового пароля обычно раздражает пользователей.