Сгенерировать секретный код для сброса пароля

Я делаю модуль, который позволяет пользователям сбросить пароль. Я заметил, как большинство сайтов предоставляют ссылку подтверждения, которая содержит строку запроса, которая имеет уникальный хеш.

Мой вопрос: как я могу генерировать этот уникальный хэш каждый раз, когда тот же запрос пользователя забыли пароль? Должен ли я хранить этот хэш в базе данных и использовать его для проверки позже? Будет ли это безопасно? Или я должен создать какой-то алгоритм, который генерирует одноразовый пароль? Как я могу создать OTP?

Solutions Collecting From Web of "Сгенерировать секретный код для сброса пароля"

Да, ты должен

  1. Создайте токен произвольного сброса. См. Например, этот ответ .
  2. Храните его в базе данных (возможно, с истечением срока действия)
  3. Отправьте электронное письмо пользователю с маркером сброса.
  4. Пользователь посещает страницу сброса пароля с маркером сброса в строке запроса.
  5. Проверьте базу данных, чтобы увидеть пользователя, связанного с токеном сброса, и если время истечения не прошло.
  6. Если все проверяется, разрешите пользователю сбросить пароль и удалить токен сброса из базы данных.

Кажется, что есть много путаницы в генерации маркера сброса (или того, что вы хотите назвать). Пожалуйста, прочитайте ответ, с которым я связан, и не изобретать велосипед с хешами и слабыми семенами.

Просто используя некоторую хэш-функцию с идентификатором пользователя, солью пользователя (вы соля пароль пользователя, правильно?), А псевдослучайные данные должны быть в порядке:

$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 часов» или что-то в этом роде)

удалять его из БД при использовании или истек

Путь к работе действительно порождает какую-то случайную вещь и хранит ее в базе данных. Как только пароль будет изменен, вы удалите соответствующую запись из таблицы, чтобы ссылка не использовалась снова.

  • Отправьте URL-адрес пользователю, включая «токен».
  • Если ссылка посещена, проверьте, существует ли токен, разрешите пользователю сменить пароль
  • Удалите токен из базы данных.

Как уже говорилось в других ответах, выполнение SHA1 или MD5 идентификатора пользователя, в сочетании с microtime и некоторой солевой строкой, как правило, является безопасной ставкой.

1) Чтобы создать уникальный хеш, смешайте текущее время, идентификатор пользователя и некоторую соль (текст). Например, если ваш сайт – mysite.com, используйте этот код:

  $hash = md5(time() . $userid . 'mysite'); 

Это создаст хороший хеш.

2) Да, сохраните его в базе данных.
3) Да, если вы истекаете хэш через определенный промежуток времени, он будет безопасным.
4) Нет, генерация одноразового пароля обычно раздражает пользователей.