2012-02-08 5 views
4

Я работаю над разработкой сильного алгоритма для надежного восстановления паролей и поиска обратной связи от сообщества пользователей. Вот что я придумал до сих пор (с помощью What are best practices for activation/registration/password-reset links in emails with nonce) процесс сбросаНадежный алгоритм для «сброса пароля»

Пароль работает следующим образом: Когда пользователь запрашивает, что «сбросить пароль канала связи по электронной почте к ним» ...

  1. Сгенерировать $ salt
  2. Подскажите пользователю адрес электронной почты, на который они хотят отправить ссылку на «сброс пароля».
  3. Извлечение $ ключа (= секретный пользовательский предопределенные данные чувствительные счета, что только они знают, такими как город, они родились или ПКР # LAST4)
  4. Создание $ nonce = хэш ($ электронной почты. $ Ключа)
  5. Сохранить в таблице:
    • $ нонс (PK)
    • $ соль
    • $ EXP_DATE
  6. Создание $ хеш = хеш ($ соль $ электронная почта $ ключ..)
  7. Email пользователю ссылку, чтобы сбросить свой пароль @ URL = ... хэш = $ хэш

Когда пользователь нажимает на ссылку, мы послали их, приводит их к виду:

  • Enter $ электронная почта
  • Введите $ новый_пароль
  • Confirm $ новый_пароль
  • Запрашивать Key Field ... то есть: «Введите город вы родились в:» Введите $ ключ

Когда пользователь отправляет этот образуют ...

  1. Получить $ хэш от URL
  2. Recreate $ Нонс = хэш ($ электронной почты. $ key)
  3. Используйте $ nonce для извлечения $ salt из нашей таблицы (если не реализовано).
  4. Если хэш ($ соль. $ По электронной почте. $ Ключ) == $ хэш из URL, то проверка ХОРОШО !, поэтому мы ... обновление пароля пользователя в базе данных
  5. В противном случае, мы отказываемся от попытка изменить пароль

Примечания:

  • Все $ электронная почта и $ основные ответы обрезаются и нижнему регистру до обработки, чтобы избежать путаницы.
  • Регулярное техническое обслуживание sproc должно периодически удалять все истекшие разряды, чтобы таблица была чистой

Как вы думаете?

+1

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

+0

Niklas: Любой, у кого есть токен, может его взломать. (т. е. любой, кто может заглянуть в учетную запись электронной почты пользователя - злые системные администраторы, следующий парень, чтобы использовать публичный ПК после того, как оригинальный пользователь забыл выйти и т. д.). –

+0

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

ответ

-1

Пара вопросов. Сохраняя nonce в БД, вы полностью уничтожаете значение nonce и, следовательно, ослабляете общую безопасность приложения.Сохраняя соль, вы также ослабляете безопасность, потому что, если я получу доступ к базе данных, я знаю «случайное» значение соли, которое вы использовали для учетной записи, поэтому открывая вам атаки на радужные таблицы.

Когда пользователь отправляет эту форму ...

Retrieve $hash from the URL 
Recreate $nonce = hash($email . $key) 
Use $nonce to retrieve $salt from our table (if unexpired). 
If hash($salt . $email . $key) == $hash from URL, then the Validation is GOOD!, so we... Update the user's password in the database 
Otherwise, we refuse the attempt to change the password 

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

Смежные вопросы