Rails 4:如何解密Rails 4会话cookie(给定会话密钥和密钥)

4
在Rails 3中,会话cookie可以使用base64解码轻松解密,但在Rails 4中,cookie不仅被编码,还被加密。假设我们知道密钥基础,我想知道如何读取Rails 4 cookie的内容。谢谢。
1个回答

6
Rails 4使用AES-256加密cookie,密钥基于您的应用程序的secret_token_base。以下是解密会话cookie的一般方案:
  1. 计算您的秘密密钥
  2. 对cookie值进行Base 64解码
  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)

注意事项:

  • 这段代码片段与实际的 ActiveSupport::MessageEncryptor 中的 {{link1:_decript 方法实现几乎相同,该方法由 ActionDispatch::Cookies 中间件使用。

  • 这一切都非常特定于 Rails 4,来自 ActionDispatch::Session::CookieJar:

    如果你只设置了secret_token,那么你的 cookies 将会被签名,但不加密。这意味着用户无法在不知道应用程序的秘密密钥的情况下更改其 +user_id+,但可以轻松读取其 +user_id+。这是 Rails 3 应用程序的默认设置。

    如果你设置了secret_key_base,则你的 cookies 将会被加密。这比签名 cookies 更进一步,因为加密 cookies 不能被用户更改或读取。这是从 Rails 4 开始的默认设置。


1
嘿!'encrypted cookie'(第1行)和cookie_str(第3行)之间有什么区别吗? - Alexander Komarov
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Dani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接