rails 4中secret_key_base的用途是啥
Posted
技术标签:
【中文标题】rails 4中secret_key_base的用途是啥【英文标题】:What is the use of secret_key_base in rails 4rails 4中secret_key_base的用途是什么 【发布时间】:2014-10-15 02:56:42 【问题描述】:我是Rails 4 的新手,不明白Rails 4 中config/secrets.yml
下secret_key_base
的使用。请您解释一下这个概念吗?
另外,当我在生产环境中工作时,系统会提示我将secret_key
设置为devise.rb
、config.secret_key
和secret_key_base
。但是,我可以使用rake secret
命令生成一个新秘密。
开发环境和生产环境有什么区别?
每次生成时都加上secret_key_base
,新生成的secret_key
如何匹配?
它如何保护应用程序与其他服务器的安全?
【问题讨论】:
适用于使用 Ruby on Rails 5.2 或更高版本的读者。secret_key_base
仍在使用,但存储在 config/credentials.yml.enc
中。此文件已加密。您可以找到有关新凭证系统here 的更多信息,或运行rails credentials:help
。
【参考方案1】:
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 框架内的三个核心功能使用:
cookies.encrypted
。
为 HMAC 签名的 cookie 派生密钥,这些 cookie 是
可通过cookies.signed
访问。
为所有
应用程序的命名为 message_verifier
实例。
在article by @michaeljcoyne 中查看有关这三个方面的更多信息。
【讨论】:
请注意,如果您使用 Ansible 或类似的东西来部署,您可以在生产部署期间替换整个 secret.yml,如果您愿意,可以替换 gitignoreconfig/secret.yml
。
其实从Rails 4.1开始就引入了config/secrets.yml
这意味着当您更改secret_key_base
时,您的用户将被注销。至少。【参考方案2】:
secret_key_base 用于加密和签名会话
为了安全地在 cookie 中来回发送会话
在 Rails 4 中,
-
如果您的应用名为
Hello
,并且
你设置session['a'] = 'b'
,
您的 cookie 将如下所示:
_Hello_session=BAh7B0kiD3%3D%3D--dc40a55cd52fe32bb3b84ae0608956dfb5824689
翻译成:
_Hello_session=<encrypted a=b>--<digital signature>
Cookie 由服务器设置并保存在客户端,每次我们请求页面时,浏览器都会将设置的 Cookie 重新发送到服务器。
为了防止邪恶的人理解a=b
字符串,它被加密。
为了防止邪恶的人篡改cookies,使用了数字签名。
在这两种情况下,都使用 secret_key_base 值(加密/解密 a=b 并验证数字签名)。
【讨论】:
1.据我所知,会话数据保存在服务器中,并且 cookie 中有一个 session_id。例如。将 user_id 存储在会话中,浏览器可以看到唯一的 session_id,而一旦登录服务器就可以知道哪个用户通过 session_id 发送请求。在这里你说 session['a'] = 'b' 将加密 cookie 中的数据。我不确定您是否对会话和 cookie 感到困惑。 2.浏览器如何在不知道secret_key_base的情况下解密并获取信息? 抱歉,现在我知道 Rails 使用的是基于 cookie 的会话,这意味着会话信息存储在 cookie 中。 是的,这是正确的,基于 cookie 的会话为分布式应用服务器中的会话提供可移植性和速度以上是关于rails 4中secret_key_base的用途是啥的主要内容,如果未能解决你的问题,请参考以下文章
在 Rails 6 上定义 secret_key_base 的正确方法是啥?
我可以在没有 Ruby 的情况下生成 Rails SECRET_KEY_BASE 吗?
Rails 6 secret_key_base 与 secret_token
部署 Ruby on Rails 6 - AWS Elastic Beanstalk - Docker: ArgumentError: Missing `secret_key_base`