Сброс пароля по электронной почте без таблицы базы данных

Нормальный поток для того, чтобы изменить пароль пользователя почтой является этим:

  1. Генерируйте случайную строку и сохраните ее в таблице базы данных
  2. Почтовая строка пользователю
  3. Пользователь нажимает на ссылку, содержащую строку
  4. Строка проверена против базы данных; если это соответствует, pw пользователя сбрасывается

Однако поддержание таблицы и истечение старых строк и т.д. походят на что-то вроде ненужной стычки. Есть ли в этом альтернативном подходе какие-либо очевидные дефекты?

  1. Генерируйте хеш MD5 текущего пароля пользователя
  2. Почтовый хеш представляет в виде строки пользователю
  3. Пользователь нажимает на ссылку, содержащую строку
  4. Строка проверена путем хеширования существующего pw снова; если это соответствует, pw пользователя сбрасывается

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

И да, существует один очевидный "дефект": ссылка сброса, таким образом сгенерированная, не истечет, пока пользователь не изменится, их пароль (нажимает на ссылку). Я действительно не вижу, почему это было бы проблемой, хотя - если почтовый ящик поставлен под угрозу, пользователь завинчен так или иначе. И нет никакого риска повторного использования, с тех пор после того как пароль пользователя изменяется, ссылка сброса больше не будет соответствовать.

7
задан lambshaanxy 3 March 2013 в 04:56
поделиться

3 ответа

Чтобы исправить очевидный недостаток , добавьте текущую дату (и дополнительную информацию о времени, представляющую текущую долю дня, если даже day слишком длинный) к тому, что вы хешируете, чтобы сгенерировать загадочную строку и проверить ее - это приводит к тому, что строка «истекает» (вы можете проверить предыдущую, а также текущую дату или дробную часть, если вы хотите более длительное «истечение»). Так что мне кажется, что ваша схема вполне жизнеспособна.

8
ответ дан 6 December 2019 в 19:34
поделиться

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

3
ответ дан 6 December 2019 в 19:34
поделиться

На самом деле, подумав об этом еще раз, ваш метод потенциально менее безопасен, чем "Обычный поток".

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

Сценарий 1:

  1. Jim регистрируется на вашем сайте как jimjones@microsoft.com.
  2. Джим запрашивает сброс пароля, но не использует его. Письмо со сброшенным паролем навечно остается в его почтовом ящике.
  3. Джим меняет свой адрес электронной почты на вашем сайте.
  4. jimjones@gmicrosoft.com взломан Bob.
  5. Боб теперь проводит атаку перебором через свою распределенную ферму GPGPU и восстанавливает пароль Джима.

Сценарий 2:

  1. Джим использует пароль jimjonesupinthisma! для своего банковского счета.
  2. Jim регистрируется на вашем сайте как jimjones@microsoft.com. jimjones@microsoft.com никак не связан с банковским счетом Джима.
  3. jimjones@gmicrosoft.com взломан Бобом.
  4. Боб запрашивает сброс, теперь у него есть HASH(HASH(пароль Джима)).
  5. Боб теперь проводит атаку перебором через свою распределенную ферму GPGPU и восстанавливает пароль Джима, который он затем использует для доступа к банковскому счету Джима.

Сценарий 3:

(Ваш сайт использует TLS, пользователи регистрируются через TLS.)

  1. Джим регистрируется на вашем сайте как jimjones@microsoft.com.
  2. Боб запрашивает сброс пароля на учетной записи Джима.
  3. Боб работает в АНБ в комнате 641A.
  4. Боб использует свой глобальный интернет-снифер и получает HASH(HASH(пароль Джима)), поскольку он отправлен по электронной почте открытым текстом на jimjones@microsoft.com.
  5. Боб теперь проводит атаку перебором через свою распределенную ферму GPGPU и восстанавливает пароль Джима.

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

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

2
ответ дан 6 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

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