У меня есть вопрос о том, как направляющие обрабатывают шифрование/дешифрование 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
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
.
Если вы извлекаете поле 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))
Он вообще не зашифрован.