我是Rails 4的新手,并且不理解在Rails 4中secret_key_base
下使用config/secrets.yml
。你能解释一下这个概念吗?
此外,当我在生产环境中工作时,系统会提示我将secret_key
设置为devise.rb
,config.secret_key
和secret_key_base
。但是,我可以使用rake secret
命令生成新秘密。
开发和生产环境之间有什么区别?
每当我生成secret_key
时,它与新生成的secret_key_base
如何匹配?
如何使用其他服务器保护应用程序?
答案 0 :(得分:53)
secret_token.rb
文件的内容包含一个长随机字符串 ,用于验证已签名Cookie的完整性 (例如用户登录时的用户会话)你的网络应用程序)。
使用
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(有点旧)但很长,但确实充满了有关该主题的有用信息。
从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框架中的三个核心功能使用:
cookies.encrypted
。cookies.signed
访问。message_verifier
实例。查看article by @michaeljcoyne中的三个中的每一个。
答案 1 :(得分:23)
在 Rails 4 中,
Hello
,则session['a'] = 'b'
,你的cookie看起来像这样:
_Hello_session=BAh7B0kiD3%3D%3D--dc40a55cd52fe32bb3b84ae0608956dfb5824689
转换为:
_Hello_session=<encrypted a=b>--<digital signature>
Cookie由服务器设置并保持客户端,每次我们请求页面时,浏览器都会将cookie重新设置为服务器。
为了防止邪恶的人理解a=b
字符串,它是加密
为防止恶意篡改cookie,使用数字签名。
在这两种情况下都使用 secret_key_base 值(加密/解密a = b并验证数字签名)。