79

我是Rails 4 的新手,不明白Rails 4 中secret_key_baseunder的使用。config/secrets.yml你能解释一下这个概念吗?

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

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

每次生成secret_key时添加它时它如何匹配新生成的?secret_key_base

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

4

2 回答 2

67

secret_token.rb文件的内容包括一个长的随机字符串,用于验证签名 cookie 的完整性(例如,当人们登录到您的 Web 应用程序时的用户会话)。

文档说:

使用secret_token.rb初始化程序中现有的 secret_key_base 为在生产模式下运行 Rails 应用程序的用户设置 SECRET_KEY_BASE 环境变量。或者,您可以简单地将现有的 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

这篇文章 (有点老而且)很长,但确实充满了有关该主题的有用信息。


更新 04.05.15

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

阅读有关如何根据创新将现有应用程序升级到 4.2.x 的信息。


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

Rails 框架中的三个核心特性使用了应用程序的key_generator,因此:secret_key_base

  • 派生可通过 访问的加密 cookie 的密钥 cookies.encrypted
  • 派生 HMAC 签名 cookie 的密钥,可通过cookies.signed.
  • Deriving keys for all of the application’s named message_verifier instances.

Check out more on each of the three in the article by @michaeljcoyne.

于 2014-08-21T13:14:35.277 回答
27

secret_key_base is used to encrypt and sign session

in order to safely send session back and forth in cookies


In Rails 4,

  1. if your app is called Hello, and
  2. you set session['a'] = 'b',

your cookie will look something like this:

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

which translates into:

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

Cookies are set by server and kept client side, with browser resending set cookies to the server every time we request a page.

To prevent evil people from understanding a=b string, it's encrypted.
To prevent evil people from tampering cookies, digital signature is used.

In both cases secret_key_base value is used (to encrypt/decrypt a=b and to validate digital signature).

于 2015-08-05T21:49:19.557 回答