Предотвращение повторного использования пароля с Devise - PullRequest
4 голосов
/ 08 февраля 2012

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

Это также похоже на то, что принуждение пользователя не использовать один из последних паролей X (в моем случае 10) необходимо будет кодировать вручную.

Я думаю, что я создам что-то вроде таблицы user_passwords и использую логику в своем коде, чтобы новый пароль не совпадал ни с одним в этой таблице для этого пользователя. В то же время я вставил бы новый пароль в таблицу, если там уже не было 10 записей для этого пользователя, что означало бы, что я перезапишу самый старый с новым значением. Структура таблицы будет выглядеть примерно так:

user_passwords

  • user_id
  • encrypted_password
  • created_at

Если у кого-то есть лучшее, более элегантное решение для этого, я был бы признателен.

Ответы [ 4 ]

6 голосов
/ 22 апреля 2015

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

На практике исследования, связанные с безопасностью, показали, что это плохая идея. Это потому, что вы получаете убывающую отдачу от каждого изменения. Таким образом, пароль начинает работать надежно, а затем со временем ослабевает, когда пользователь пытается соблюдать политику. См. Техническая безопасность Питера Гутмана и Глава 7, Пароли .

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


... создайте что-то вроде таблицы user_passwords и используйте логику в моем коде, чтобы новый пароль не совпадал ни с одним в этой таблице для этого пользователя.

И как только вы прочитаете главу, я смогу спросить: почему вы разрешили пользователю выбирать слабый / раненый / взломанный пароль? Эти 60-килобайтные фильтры Блума выглядят очень полезными в сочетании с списком Марка Брунетта из 10 миллионов утекших паролей :)


Предотвращение повторного использования пароля ...

Повторное использование, которое повредит, - это повторное использование пароля на разных сайтах. Браун, Бракен, Зокколи и Дуглас заявляют, что цифры составляют около 70% в Создание и запоминание паролей (Прикладная когнитивная психология, том 18, выпуск 6, стр. 641–651). А Дас, Бонно, Цезарь, Борисов и Ван сообщают о числе около 45% в Запутанная сеть повторного использования пароля . Обратите внимание, что исследование Tangled Web было взломано паролей, так что это число, вероятно, выше, потому что они не смогли восстановить все пароли

Чтобы сделать повторное использование более острой проблемой, пользователи должны запомнить пароли для примерно 25 различных сайтов в соответствии с Das, Bonneau, Caesar, Borisov and Wang в Tangled Web of Password Reuse .

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

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

2 голосов
/ 09 февраля 2012

devise_security_extension , кажется, работает для того, что мне нужно.

Однако в настоящее время он не поддерживает Devise 2.0 или выше. Я столкнулся с рядом проблем, и мне пришлось понизить мой Devise до 1.5.3. Согласно комментариям на их доске объявлений, в настоящее время они работают над переносом гема на версию, совместимую с Devise 2.0.

Я дал ему немного времени для его модулей password_expurable и password_archivable. Кажется, все работает как положено.

Он также поддерживает secure_validatable, session_limitable и expurable, первые 2 из которых я, вероятно, буду использовать в ближайшем будущем.

0 голосов
/ 30 ноября 2017

В PasswordsController вы можете проверить это.

class PasswordsController < Devise::PasswordsController

  def update
    current_user = User.with_reset_password_token(params[:user][:reset_password_token])
    if current_user && previous_and_new_password_is_same?(current_user)
      current_user.errors[:password] << "has been used previously."
      self.resource = current_user
      respond_with resource
    else
      super
    end
  end

  private

  def previous_and_new_password_is_same?(current_user)
    bcrypt       = ::BCrypt::Password.new(current_user.encrypted_password)
    hashed_value = ::BCrypt::Engine.hash_secret([params[:user][:password], Devise.pepper].join, bcrypt.salt)
    hashed_value == current_user.encrypted_password
  end

end

Здесь - документация к Devise gem для Как запретить ранее использованные пароли?

0 голосов
/ 11 июля 2016

devise_security_extension не работает для меня в rails 5, я создал свой кастом:

  • создайте миграцию и добавьте дополнительный столбец, например: add_column: users,: old_passwords,: text
  • В вашей модели добавьте два обратных вызова: after_save: cache_old_pass и before_save: verify_old_pass

  • Создайте методы обратных вызовов:

    private
    def verify_old_pass
      if self.encrypted_password_changed?
        old_passwords.to_s.split(',').each do |pass_encrypted|
          if Devise::Encryptor.compare(self.class, pass_encrypted, password)
            errors.add(:base, 'Your password cannot be previous up to 3 back')
            return throw(:abort)
          end
        end
      end
    end
    
    def cache_old_pass # cache last 3 passwords
     if self.encrypted_password_changed?
       update_column(:old_passwords, ([self.encrypted_password] + old_passwords.to_s.split(',')[0, 3]).join(','))
     end
    end
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...