Rails 4: 如何解密 rails 4 session cookie (给定session key和secret)

Rails 4: How to decrypt rails 4 session cookie (Given the session key and secret)

在 Rails 中,3 会话 cookie 可以使用 base64 解码轻松解码,但在 Rails 中,4 cookie 被编码和加密。

我想知道如何读取 rails 4 个经过编码和加密的 cookie(假设我们知道密钥库)。

谢谢,

Rails 4 使用AES-256根据您应用的secret_token_base.

密钥加密cookies

这是解密会话 cookie 的一般方案:

  1. 计算你的密钥
  2. Base 64 解码 cookie 值
  3. 用'--'拆分解码后的cookie值,这将产生两部分,第一部分是加密数据,第二部分是加密方案使用的初始化向量。 Base 64 独立解码每个部分。
  4. 通过使用密钥和初始化向量应用 AES 解密来解密加密数据。

我找不到可以轻松解密消息的网站(欢迎提供建议),可以通过编程方式完成:

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)

一些注意事项:

  • 此代码片段与 ActionDispatch::Cookies 中间件使用的实际 _decript method implementation in ActiveSupport::MessageEncryptor 几乎相同。

  • 这都是非常多的Rails4具体,来自ActionDispatch::Session::CookieJar:

    If you only have secret_token set, your cookies will be signed, but not encrypted. This means a user cannot alter their +user_id+ without knowing your app's secret key, but can easily read their +user_id+. This was the default for Rails 3 apps.

    If you have secret_key_base set, your cookies will be encrypted. This goes a step further than signed cookies in that encrypted cookies cannot be altered or read by users. This is the default starting in Rails 4.