【发布时间】:2016-05-03 00:00:05
【问题描述】:
在 Rails 3 中,会话 cookie 可以通过 base64 解码轻松解码,但在 Rails 4 中,cookie 被编码和加密。
我想知道如何读取经过编码和加密的 rails 4 cookie(假设我们知道密钥库)。
谢谢,
【问题讨论】:
标签: ruby-on-rails session ruby-on-rails-4 session-cookies
在 Rails 3 中,会话 cookie 可以通过 base64 解码轻松解码,但在 Rails 4 中,cookie 被编码和加密。
我想知道如何读取经过编码和加密的 rails 4 cookie(假设我们知道密钥库)。
谢谢,
【问题讨论】:
标签: ruby-on-rails session ruby-on-rails-4 session-cookies
Rails 4 使用 AES-256 使用基于您应用的 secret_token_base 的密钥加密 cookie。
这是解密会话 cookie 的一般方案:
我找不到可以轻松解密消息的网站(欢迎提供建议),可以通过编程方式完成:
secret = OpenSSL::PKCS5.pbkdf2_hmac_sha1(app_secret_token, 'encrypted cookie', 1000, 64)
encrypted_message = Base64.decode64(cookie_str)
cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
encrypted_data, iv = encrypted_message.split("--").map {|v| ::Base64.strict_decode64(v)}
cipher.decrypt
cipher.key = secret
cipher.iv = iv
decrypted_data = cipher.update(encrypted_data)
decrypted_data << cipher.final
Marshal.load(decrypted_data)
几个笔记:
此代码 sn-p 与 ActionDispatch::Cookies 中间件使用的实际 _decript method implementation in ActiveSupport::MessageEncryptor 几乎相同。
这都是 Rails 4 特有的,来自 ActionDispatch::Session::CookieJar:
如果您只设置了 secret_token,您的 cookie 将被签名,但不加密。这意味着用户无法在不知道您应用的密钥的情况下更改他们的 +user_id+,但可以轻松读取他们的 +user_id+。这是 Rails 3 应用程序的默认设置。
如果您设置了 secret_key_base,您的 cookie 将被加密。这 比签名的 cookie 更进一步,因为加密的 cookie 不能 被用户更改或阅读。这是从 Rails 4 开始的默认设置。
【讨论】:
'encrypted cookie'(第 1 行)和 cookie_str(第 3 行)有区别吗?
encrypted cookie 字符串按原样用作生成密钥所需的盐(可能可以覆盖,但这是默认盐),而cookie_str 是您要解密的实际 cookie。如果您不熟悉盐的概念,请查看:en.wikipedia.org/wiki/Salt_(cryptography)