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.ymlsecret_key_base 的使用。请您解释一下这个概念吗?

另外,当我在生产环境中工作时,系统会提示我将secret_key 设置为devise.rbconfig.secret_keysecret_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_generatorsecret_key_base 被 Rails 框架内的三个核心功能使用:

为可通过以下方式访问的加密 cookie 派生密钥 cookies.encrypted。 为 HMAC 签名的 cookie 派生密钥,这些 cookie 是 可通过cookies.signed 访问。 为所有 应用程序的命名为 message_verifier 实例。

在article by @michaeljcoyne 中查看有关这三个方面的更多信息。

【讨论】:

请注意,如果您使用 Ansible 或类似的东西来部署,您可以在生产部署期间替换整个 secret.yml,如果您愿意,可以替换 gitignore config/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`

Rails 4:在本地主机上重新验证“无效的站点密钥”

弃用警告:您没有设置config.secret_key_base