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

时间:2016-01-26 12:10:49

标签: ruby-on-rails session ruby-on-rails-4 session-cookies

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

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

谢谢,

1 个答案:

答案 0 :(得分:5)

Rails 4使用AES-256根据您的应用secret_token_base使用密钥加密Cookie。

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

  1. 计算您的密钥
  2. Base 64解码cookie值
  3. 将解码后的cookie值拆分为' - ',这将产生两部分,第一部分是加密数据,第二部分是加密方案使用的初始化向量。 Base 64独立解码每个部分。
  4. 通过对密钥和初始化向量应用AES解密来解密加密数据。
  5. 我无法找到一个可以轻松解密邮件的网站(欢迎提供建议),编程方式可以这样做:

    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 middelware使用的实际_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中的默认开始。