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

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

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

谢谢,

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) 

几个笔记:

  • 此代码段几乎与ActiveSupport::MessageEncryptor的实际_decript方法实现相同,后者由ActionDispatch::Cookies middelware使用。

  • 从ActionDispatch :: Session :: CookieJar开始,这就是Rails 4所特有的:

    如果您只设置了secret_token ,则您的cookie将被签名,但不会加密 。 这意味着用户无法在不知道应用的密钥的情况下更改他们的+ user_id +,但可以轻松阅读他们的+ user_id +。 这是Rails 3应用程序的默认设置。

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