Rails 4: 如何解密 rails 4 session cookie (给定session key和secret)
Rails 4: How to decrypt rails 4 session cookie (Given the session key and secret)
在 Rails 中,3 会话 cookie 可以使用 base64 解码轻松解码,但在 Rails 中,4 cookie 被编码和加密。
我想知道如何读取 rails 4 个经过编码和加密的 cookie(假设我们知道密钥库)。
谢谢,
Rails 4 使用AES-256根据您应用的secret_token_base
.
密钥加密cookies
这是解密会话 cookie 的一般方案:
- 计算你的密钥
- Base 64 解码 cookie 值
- 用'--'拆分解码后的cookie值,这将产生两部分,第一部分是加密数据,第二部分是加密方案使用的初始化向量。 Base 64 独立解码每个部分。
- 通过使用密钥和初始化向量应用 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)
一些注意事项:
此代码片段与 ActionDispatch::Cookies
中间件使用的实际 _decript
method implementation in ActiveSupport::MessageEncryptor
几乎相同。
这都是非常多的Rails4具体,来自ActionDispatch::Session::CookieJar:
If you only have secret_token set, your cookies will be signed, but not encrypted. This means a user cannot alter their +user_id+ without knowing your app's secret key, but can easily read their +user_id+. This was the default for Rails 3 apps.
If you have secret_key_base set, your cookies will be encrypted. This
goes a step further than signed cookies in that encrypted cookies cannot
be altered or read by users. This is the default starting in Rails 4.
在 Rails 中,3 会话 cookie 可以使用 base64 解码轻松解码,但在 Rails 中,4 cookie 被编码和加密。
我想知道如何读取 rails 4 个经过编码和加密的 cookie(假设我们知道密钥库)。
谢谢,
Rails 4 使用AES-256根据您应用的secret_token_base
.
这是解密会话 cookie 的一般方案:
- 计算你的密钥
- Base 64 解码 cookie 值
- 用'--'拆分解码后的cookie值,这将产生两部分,第一部分是加密数据,第二部分是加密方案使用的初始化向量。 Base 64 独立解码每个部分。
- 通过使用密钥和初始化向量应用 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)
一些注意事项:
此代码片段与
ActionDispatch::Cookies
中间件使用的实际_decript
method implementation inActiveSupport::MessageEncryptor
几乎相同。这都是非常多的Rails4具体,来自ActionDispatch::Session::CookieJar:
If you only have secret_token set, your cookies will be signed, but not encrypted. This means a user cannot alter their +user_id+ without knowing your app's secret key, but can easily read their +user_id+. This was the default for Rails 3 apps.
If you have secret_key_base set, your cookies will be encrypted. This goes a step further than signed cookies in that encrypted cookies cannot be altered or read by users. This is the default starting in Rails 4.