使用Rails存储加密的cookie

时间:2012-02-20 16:49:42

标签: ruby-on-rails security cookies encryption

我需要在Rails中的cookie中存储一小段数据(少于10个字符),我需要它是安全的。我不希望任何人能够读取该数据或注入他们自己的数据(因为这会打开应用程序进行多种攻击)。我认为加密cookie的内容是要走的路(我应该签名吗?)。最好的方法是什么?

现在我正在这样做,这看起来很安全,但对于那些比我更了解安全性的人而言,许多事情看起来都很安全,然后发现它并不是真的安全。

我以这种方式保存秘密:

encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token)
cookies[:secret] = {
  :value => encryptor.encrypt(secret),
  :domain => "example.com",
  :secure => !(Rails.env.test? || Rails.env.development?)
}

然后我就这样读它:

encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token)
secret = encryptor.decrypt(cookies[:secret])

这样安全吗?有没有更好的方法呢?

更新:我了解Rails的会话以及它是如何安全的,通过签名cookie和可选地存储会话服务器端的内容,我确实使用会话来实现它的本质对于。但我的问题是关于存储cookie,这是我在会话中不想要的一条信息,但我仍然需要它是安全的。

3 个答案:

答案 0 :(得分:13)

  • 设置安全Cookie

    cookies.signed[:secret] = {
     :value => "foo bar",
     :domain => "example.com",
     :secure => !(Rails.env.test? || Rails.env.development?)
    }
    
  • 访问Cookie

    cookies.signed[:secret] # returns "foo bar"
    

使用ActionController::Base.cookie_verifier_secret对Cookie进行签名。您可以在初始化文件中设置cookie_verifier_secret

答案 1 :(得分:1)

正如KandadaBoggu所说,看起来你想要的是会话变量,会话变量默认加密并存储在cookie中。但是,如果您查看config/initializers/session_store.rb的内容,您会发现以下内容:

 # Be sure to restart your server when you modify this file.
 MyRailsApp::Application.config.session_store :cookie_store, :key => '_my_rails_app_session'

 # Use the database for sessions instead of the cookie-based default,
 # which shouldn't be used to store highly confidential information
 # (create the session table with "rails generate session_migration")
 # MyRailsApp::Application.config.session_store :active_record_store

这告诉我,您应该将数据库用于会话而不是基于cookie的默认值,这不应该用于存储高度机密的信息。预先烹饪的迁移使得一切都很容易设置,因此这样做的开销非常小,一旦完成,如果你需要在以后添加新的秘密信息,基本上没有开销!

答案 2 :(得分:0)

我正在重新发布JacobM的答案,他删除了,因为这是正确的答案并指出了正确的方向。如果他取消删除它,我会删除它并选择他作为最佳答案。

  

首先,如果您使用encrypt_and_verify代替encrypt,则会使用{{1}}   为你签名。

     

但是,在安全方面,我总是更愿意依赖   在公共场合经过审查的解决方案,而不是我自己的解决方案。   一个例子是encrypted-cookies gem