【问题标题】:Rails 4: How to decrypt rails 4 session cookie (Given the session key and secret)Rails 4:如何解密 Rails 4 会话 cookie(给定会话密钥和秘密)
【发布时间】: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


    【解决方案1】:

    Rails 4 使用 AES-256 使用基于您应用的 secret_token_base 的密钥加密 cookie。

    这是解密会话 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)
    

    几个笔记:

    • 此代码 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)
    猜你喜欢
    • 2010-12-28
    • 2015-12-19
    • 2017-05-19
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    相关资源
    最近更新 更多