Генерация секретного кода для сброса пароля

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

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

12
задан meagar 24 August 2010 в 15:53
поделиться

4 ответа

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

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

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

3
ответ дан 2 December 2019 в 04:52
поделиться

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

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

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

1
ответ дан 2 December 2019 в 04:52
поделиться

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

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

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

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

0
ответ дан 2 December 2019 в 04:52
поделиться

Да, вам следует

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

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

27
ответ дан 2 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: