Учитывая сеансовый ключ и секрет, как мы можем дешифровать cookie направляющих?

У меня есть вопрос о том, как направляющие обрабатывают шифрование/дешифрование cookie.

У меня есть это в моем config/environment.rb

  config.action_controller.session = {
    :session_key => [some key],
    :secret => [some secret]
  }

И это в config/environment/production.rb и др.:

  ActionController::Base.session_options[:session_domain] = [some
domain]

Пока неплохо - пока все мои приложения для направляющих имеют тот же session_key и секрет, и находятся на том же домене, они могут все использовать тот же самый cookie.

Однако у коллеги теперь есть приложение JSP (на том же домене), с которым он хотел бы считать cookie, которые я установил.

Так, учитывая секрет и зашифрованное значение cookie, как мы дешифровали бы его для получения содержания того cookie?

(Документы, кажется, указывают, что это - одностороннее шифрование SHA1 по умолчанию - http://caboo.se/doc/classes/CGI/Session/CookieStore.html - но тогда как мои приложения направляющих считали бы содержание cookie, который является односторонний зашифрованный?)

Заранее спасибо за любые подсказки/указатели/понимание,

Joe

21
задан 21 December 2009 в 17:35
поделиться

2 ответа

Rails использует HMAC-SHA1 для шифрования куки-данных, что отличается от одностороннего шифрования SHA1, как вы и подозревали (см. статью Википедии о HMAC для пояснения). Шифрование выполняется классом ActiveSupport::MessageVerifier (исходный код достаточно хорошо читается). Вот пример, основанный на тестовом приложении Rails:

secret = 'b6ff5a9c3c97bf89afe9a72e6667bafe855390e8570d46e16e9760f6394' +
  '4ab05577b211ec2f43f6c970441518f0241775499bde055078f754c33b62f68ba27ca'

cookie = "_test_session=BAh7CCIYdXNlcl9jcmVkZW50aWFsc19pZGkGIhV1c2VyX2NyZW" +
  "RlbnRpYWxzIgGAMzBlODkxZDQ2MWZhNjFkMDFmNzczMmJjNDdjMjIwZGFjMTY2NWEwNDMwZ" +
  "DVjMmUxOWY5MDFjMjQ5NWQ4OTM1OGZlMzE3NzRiZTFiZjM1ZTVlZDY2ZGUzYTkwOWZjZTgw" +
  "NTFlNGUxZWI0MTUzYTRjODZiMGZmMzM3NzliM2U3YzI6D3Nlc3Npb25faWQiJTgxNzk0Yjd" +
  "kN2IxYzRjMDE0M2QwOTk5NTVjZjUwZTVm--25c8f3222ab1be9f2394e2795a9f2557b06d0a92"

session = cookie.split('=').last
verifier = ActiveSupport::MessageVerifier.new(secret, 'SHA1')
verifier.verify(session)

Оно должно возвращать хэш сессии, которого вы ожидаете. Для реализации этого в Java ваш коллега должен будет продублировать метод ActiveSupport::MessageVerifier#verify. Исходный код находится в вашем каталоге gems (/usr/lib/ruby/gems/1.8/gems на моей системе) по адресу activesupport-2.3.5/lib/active_support/message_verifier.rb.

.
13
ответ дан 29 November 2019 в 20:09
поделиться

Если вы извлекаете поле session.data прямо из данных сеанса, хранящихся в базе данных вашего приложения (если вы используете active_record_store в вашем файле environment.rb)

config.action_controller.session_store = :active_record_store

... вот как вы его декодируете и возвращаете хэш :

Marshal.load(ActiveSupport::Base64.decode64(@session.data))

... или в Rails> = 3.2 (спасибо Чаку Восу)

Marshal.load(Base64.decode64(@session.data))

Он вообще не зашифрован.

17
ответ дан 29 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

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