在rails 4中使用secret_key_base有什么用

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

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

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

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

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

secret_token.rb文件的内容包括一个长随机string,用于validation已签名cookie的完整性 (例如用户login到您的Web应用程序时的用户会话)。

文档说:

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

由于它是重要的文件,你不能把它放到.gitignore,所以使用envvariables来存储secret_key_base值是一个很好的习惯:

创build.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。

secret_key_base用于encryption和签名会话

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


Rails 4中

  1. 如果你的应用叫做Hello ,那么
  2. 你设置session['a'] = 'b'

你的cookie看起来像这样:

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

这转换成:

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

Cookie由服务器设置并保存在客户端,浏览器每次请求页面时都会重新发送cookie给服务器。

为了防止邪恶的人理解a=bstring,它被encryption
为了防止邪恶的人篡改cookie,使用数字签名

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