2016-09-14 1 views
1

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

Обычные способы, кроме использования гема 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+ символов, поэтому ссылки становятся довольно длинными, никаких проблем с этим?
  • другие причины, по которым не используется Подписанный глобальный идентификатор, но, следовательно, маркеры/дайджесты?

ответ

1

Подписанный идентификатор глобального идентификатора безопасен или уязвим для конкретных атак?

Подписанный Global ID представляется использовать MessageVerifier:

MessageVerifier создает подписи HMAC SHA1, используя алгоритм хеширования

HMAC over SHA1 is still considered secure.

любой недостаток, заключающийся в том, что не сохраняются жетоны/дайджест + sent_at в БД?

Главным недостатком в целом является отсутствие возможности отменить эту серверную сторону. Например, если пользователь выходит из системы или истекает срок действия всех сеансов для определенного пользователя.

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

sgid_tokens получает около 200+ символов, поэтому ссылки становятся довольно длинными, любые проблемы ?

В частности, нет.

другие причины, по которым не используется Подписанный глобальный идентификатор, но поэтому жетоны/дайджесты?

Главным образом факт, что вы не можете их увидеть или отменить на сервере, как упомянуто выше. Вы также должны убедиться, что используете сильную клавишу (> = 128 бит), и этот ключ остается закрытым. Любая утечка ключа компрометирует все токены и позволяет злоумышленнику генерировать свои собственные.

+0

Большое спасибо за ваше мнение по этому поводу! И да, вы абсолютно правы в использовании контекста с каждым GlobalID с опцией «for:» ... ». Я различаю между 'account_confirmation' и' reset_password'. При хранении дайджеста в БД (а не в токене) также невозможно «увидеть» токен, но ваша точка отзыва - хорошая точка ... Поэтому я использую 'expire_in', чтобы гарантировать, что ссылки a недействительны для долгое, но полное аннулирование было бы невозможным. – Steffen