在Rails 3中,会话cookie可以使用base64解码轻松解密,但在Rails 4中,cookie不仅被编码,还被加密。假设我们知道密钥基础,我想知道如何读取Rails 4 cookie的内容。谢谢。
secret_token_base
。以下是解密会话cookie的一般方案:
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 开始的默认设置。
'encrypted cookie'
(第1行)和cookie_str
(第3行)之间有什么区别吗? - Alexander Komarov