я обнаружил, что Подписанных глобальные идентификаторы являются удивительными для маркеров материала на основе, как парольсброса и подтверждения счета функций и хотели бы получить мнения о своей безопасности и удобстве использовании.Подписанные глобальные идентификаторы для аутентификационных токенов - безопасные или уязвимые?
Обычные способы, кроме использования гема DEViSE (модуля Confirmable + Извлекаемые) является
A) генерируют маркер (например, d3f64ce7c125410498b5393b33e7cf3c
), сохранять их в БД и отправить ссылки на /account_confirmation/#token#
B) сохранение дайджесты эти жетоны в БД и только отправка токенов по почте - чем сравнивать их с BCrypt::Password.new(digest).is_password?(token)
. Этот более безопасный подход - то, что Michael Hartl использует в своем Rails Tutorial.
C. Но как насчет Подписанные глобальных идентификаторов ?!
С Rails 4.2 Global ID Gem включен в Rails, мужественно используемый для ActiveJobs. Вот как я теперь использую их, например. счет подтверждение вещь:
Включите GlobalID::Identification
в вашей модели пользователя, чем:
>> user_sgid = User.last.to_sgid(expires_in: 2.hours, for: 'confirmation')
=> #<SignedGlobalID:0x008fde45df8937
>> sgid_token = user_sgid.to_s
=> "BAhJIh5naWQ6Ly9pZGluYWlkaS9Vc2VyLzM5NTk5BjoGRVQ=--81d73[...]20e"
Этого маркер можно отправить по электронной почте с подтверждением ссылкой счета своих пользователей, /account_confirmation/##sgid_token##
.
Не нужно экономить account_confirmation_token
или его дайджест в БД. Кроме того, вам не нужно, чтобы сохранить account_confirmation_sent_at
Timestamp, чтобы проверить, если связь остается в силе - все включено в sgid_token:
>> GlobalID::Locator.locate_signed(sgid_token, for: 'confirmation')
=> #<User:0x007fae94bf6298 @id="1">
# use the User model to activate the account, login, and so on
# 2 hours later if link expired:
>> GlobalID::Locator.locate_signed(sgid_token, for: 'confirmation')
=> nil
Вы можете отправить несколько ссылок с разных лексем, различные сроки действия и случаи использования. Мне нравится этот подход.
Дополнительная информация в описании драгоценного камня на github.
Мои вопросы:
- является Подписанный Global ID лексем безопасные или уязвимые в отношении конкретных атак?
- любой недостаток, заключающийся в том, что не сохраняются жетоны/дайджест + sent_at в БД?
- sgid_tokens получают около 200+ символов, поэтому ссылки становятся довольно длинными, никаких проблем с этим?
- другие причины, по которым не используется Подписанный глобальный идентификатор, но, следовательно, маркеры/дайджесты?
Большое спасибо за ваше мнение по этому поводу! И да, вы абсолютно правы в использовании контекста с каждым GlobalID с опцией «for:» ... ». Я различаю между 'account_confirmation' и' reset_password'. При хранении дайджеста в БД (а не в токене) также невозможно «увидеть» токен, но ваша точка отзыва - хорошая точка ... Поэтому я использую 'expire_in', чтобы гарантировать, что ссылки a недействительны для долгое, но полное аннулирование было бы невозможным. – Steffen