rails 4中secret_key_base的用途是什么

时间:2014-08-21 12:57:21

标签: ruby-on-rails ruby ruby-on-rails-4 devise secret-key

我是Rails 4的新手,并且不理解在Rails 4中secret_key_base下使用config/secrets.yml。你能解释一下这个概念吗?

此外,当我在生产环境中工作时,系统会提示我将secret_key设置为devise.rbconfig.secret_keysecret_key_base。但是,我可以使用rake secret命令生成新秘密。

开发和生产环境之间有什么区别?

每当我生成secret_key时,它与新生成的secret_key_base如何匹配?

如何使用其他服务器保护应用程序?

2 个答案:

答案 0 :(得分:53)

secret_token.rb文件的内容包含一个长随机字符串 ,用于验证已签名Cookie的完整性 (例如用户登录时的用户会话)你的网络应用程序)。

Documentation说:

  

使用secret_token.rb初始值设定项中现有的secret_key_base   为任何用户设置SECRET_KEY_BASE环境变量   在生产模式下运行Rails应用程序。或者,您可以将现有的secret_key_base从secret_token.rb初始化程序复制到生产部分下的secrets.yml,替换<%= ENV["SECRET_KEY_BASE"] %>

由于它是重要文件,并且您无法将其放入.gitignore,因此使用env变量来存储secret_key_base值是一种很好的做法:

创建.env.powenv文件并将其存储为:

export SECRET_TOKEN="9489b3eee4eccf317ed77407553e8adc97baca7c74dc7ee33cd93e4c8b69477eea66eaedeb18af0be2679887c7c69c0a28c0fded0a71ea472a8c4laalal19cb"

然后在config/initializers/secret_token.rb

YourAppName::Application.config.secret_key_base = if Rails.env.development? or Rails.env.test? # generate simple key for test and development environments
  ('a' * 30) # should be at least 30 chars long
else
  ENV['SECRET_TOKEN']
end

This article(有点旧)但很长,但确实充满了有关该主题的有用信息。


更新04.05.15

从Rails 4.2开始,不再有secret_token.rb个文件。 根据新的约定,有一个config/secrets.yml文件旨在存储应用程序的秘密。

Have a read了解如何根据创新将现有应用升级到4.2.x.


从技术上讲,secrect_key_base的目的是成为应用程序的key_generator方法的秘密输入(检查Rails.application.key_generator)。

应用程序的key_generator以及secret_key_base由Rails框架中的三个核心功能使用:

  • 导出可通过访问的加密cookie的密钥 cookies.encrypted
  • 获取HMAC签名的密钥 可通过cookies.signed访问。
  • 为所有人提供密钥 应用程序名为message_verifier实例。

查看article by @michaeljcoyne中的三个中的每一个。

答案 1 :(得分:23)

secret_key_base用于加密和签署会话

以便在cookie中来回安全地发送会话

Rails 4 中,

  1. 如果您的应用名称为Hello,则
  2. 您设置session['a'] = 'b'
  3. 你的cookie看起来像这样:

    _Hello_session=BAh7B0kiD3%3D%3D--dc40a55cd52fe32bb3b84ae0608956dfb5824689
    

    转换为:

    _Hello_session=<encrypted a=b>--<digital signature>
    

    Cookie由服务器设置并保持客户端,每次我们请求页面时,浏览器都会将cookie重新设置为服务器。

    为了防止邪恶的人理解a=b字符串,它是加密 为防止恶意篡改cookie,使用数字签名

    在这两种情况下都使用 secret_key_base 值(加密/解密a = b并验证数字签名)。