在rails 4中使用secret_key_base有什么用
我是Rails 4的新手,并不明白在Rails 4中config/secrets.yml
secret_key_base
下的secret_key_base
的用法。你能解释一下这个概念吗?
另外,当我在生产环境中工作时,系统会提示secret_key
使用devise.rb
, config.secret_key
和secret_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中 ,
- 如果你的应用叫做
Hello
,那么 - 你设置
session['a'] = 'b'
,
你的cookie看起来像这样:
_Hello_session=BAh7B0kiD3%3D%3D--dc40a55cd52fe32bb3b84ae0608956dfb5824689
这转换成:
_Hello_session=<encrypted a=b>--<digital signature>
Cookie由服务器设置并保存在客户端,浏览器每次请求页面时都会重新发送cookie给服务器。
为了防止邪恶的人理解a=b
string,它被encryption 。
为了防止邪恶的人篡改cookie,使用数字签名 。
在这两种情况下都使用secret_key_base值(encryption/解密a = b并validation数字签名)。