Генерация секретного кода для сброса пароля - PullRequest
12 голосов
/ 24 августа 2010

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

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

Ответы [ 4 ]

27 голосов
/ 24 августа 2010

Да, вы должны

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

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

3 голосов
/ 24 августа 2010

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

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

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

1 голос
/ 24 августа 2010

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

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

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

0 голосов
/ 24 августа 2010

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

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

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

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

...