Ruby on rails 为什么要在Rails中动态生成secret_token.rb?
在Hartl的教程中,他重写了secret_token.rb以动态生成秘密令牌。他为什么那样做?只要不进行版本控制,将其存储在文件中有什么区别 Hartl的secure_token.rb代码:Ruby on rails 为什么要在Rails中动态生成secret_token.rb?,ruby-on-rails,security,ruby-on-rails-4,Ruby On Rails,Security,Ruby On Rails 4,在Hartl的教程中,他重写了secret_token.rb以动态生成秘密令牌。他为什么那样做?只要不进行版本控制,将其存储在文件中有什么区别 Hartl的secure_token.rb代码: require 'securerandom' def secure_token token_file = Rails.root.join('.secret') if File.exist?(token_file) # Use the existing token. File.re
require 'securerandom'
def secure_token
token_file = Rails.root.join('.secret')
if File.exist?(token_file)
# Use the existing token.
File.read(token_file).chomp
else
# Generate a new token and store it in token_file.
token = SecureRandom.hex(64)
File.write(token_file, token)
token
end
end
SampleApp::Application.config.secret_key_base = secure_token
这很简单。通过这种令牌生成:
但是,显示如何生成您的秘密令牌已经足够危险了。您使用的工具或库在任何给定时间点都可能受到攻击。这很简单。通过这种令牌生成:
但是,显示如何生成您的秘密令牌已经足够危险了。您使用的工具或库在任何给定时间点都可能受到攻击。更好的方法是使用环境变量。这就不那么痛苦了。有些主机(如Heroku)提供只读环境,因此无法工作,因为每次部署时都会删除文件
。secret
,这意味着每次签名的cookie都会失效。此外,这段代码会减慢应用程序的初始化速度,这很奇怪。将其与App.config.secret\u key\u base=ENV['SECURE\u TOKEN']'some\u TOKEN'进行比较。这正是我的意思。另外,管理环境变量比这段代码要容易得多(而且也是持久性的)。@ukaszNiemier:你能想出Hartl在他的教程中包含它的原因吗?我不知道。也许他不喜欢环境变量?或者他就是不习惯这样。问问他。为什么不问问他?更好的办法是使用环境变量。这就不那么痛苦了。有些主机(如Heroku)提供只读环境,因此无法工作,因为每次部署时都会删除文件。secret
,这意味着每次签名的cookie都会失效。此外,这段代码会减慢应用程序的初始化速度,这很奇怪。将其与App.config.secret\u key\u base=ENV['SECURE\u TOKEN']'some\u TOKEN'进行比较。这正是我的意思。另外,管理环境变量比这段代码要容易得多(而且也是持久性的)。@ukaszNiemier:你能想出Hartl在他的教程中包含它的原因吗?我不知道。也许他不喜欢环境变量?或者他就是不习惯这样。问他。你为什么不问他?如果你不控制你的secure_token.rb的版本,原因2就不对了。还是我错了?是的,你是对的。只要你不进行版本控制,就没有令牌。我已经更新了我的答案。@marvelousNinja-SecureRandom
是安全的。显示您生成的安全令牌并没有那么不安全(正如rakesecret
所做的那样)。我不是说生成令牌的具体方式。公开你的算法只是展示你是如何做的。这是攻击者一直想要的知识。如果您不控制secure_token.rb的版本,则原因2将不正确。还是我错了?是的,你是对的。只要你不进行版本控制,就没有令牌。我已经更新了我的答案。@marvelousNinja-SecureRandom
是安全的。显示您生成的安全令牌并没有那么不安全(正如rakesecret
所做的那样)。我不是说生成令牌的具体方式。公开你的算法只是展示你是如何做的。这是攻击者一直想要的知识。