Rails 4不加密cookie内容

时间:2014-06-17 21:38:02

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

你好我正在尝试加密和保护我的cookie中包含的数据,但似乎数据只是被编码(base64)

这是一个例子:

cookies.signed[:example] = { :value => 'can you see this?', :httponly => true, :expire_after => 30.minutes, :secure => true }

这是cookie的内容:

BAhJIhZjYW4geW91IHNlZSB0aGlzPwY6BkVG--b4a8bbd7cd35e392ccd788df0008fd10b48442b2

如果我解码字符串(base64),我得到:

I"can you see this?:EFom{q{vq{_M<}to8f

我想知道我错过了什么,目前这就是我所拥有的

session_store.rb:

Service::Application.config.session_store :cookie_store, key: '_service_session'

在我的secret_token.rb中我设置了这样的东西:

Service::Application.config.secret_key_base = 'e892d55cbc205bb6..'

2 个答案:

答案 0 :(得分:3)

您的Cookie未加密,因为您在Cookie jar上使用了signed方法,而且只是签署了Cookie内容。

要加密Cookie,请使用encrypted方法:

cookies.encrypted[:discount] = 45
# => Set-Cookie: discount=ZS9ZZ1R4cG1pcUJ1bm80anhQang3dz09LS1mbDZDSU5scGdOT3ltQ2dTdlhSdWpRPT0%3D--ab54663c9f4e3bc340c790d6d2b71e92f5b60315; path=/

cookies.encrypted[:discount] # => 45

答案 1 :(得分:1)

捎带接受的答案:

根据您的具体情况:如果您需要加密,可能需要考虑使用会话Cookie。 (正如公认的答案所暗示的那样:你可以加密cookie,但也许会话cookie更合适。)

默认情况下,在rails 4中:会话cookie默认为加密和签名。

Relevant Rails Documentation

具体部分:

  

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

     

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

默认情况下,

secret_key_base位于rails 4中:config / secrets.yml。

在rails 4中的用法:

# In rails 4 by default, this will be encrypted and signed
session[user_id] = 1