Ruby on rails 我的cookie令牌足够强大,以便将其用于用户身份验证目的?

Ruby on rails 我的cookie令牌足够强大,以便将其用于用户身份验证目的?,ruby-on-rails,ruby,security,ruby-on-rails-3,cookies,Ruby On Rails,Ruby,Security,Ruby On Rails 3,Cookies,我正在运行RubyonRails3,我知道为了用户身份验证而设置cookie值所使用的代码是否足够强大 在我的模型中,我有: require 'digest' class User < ActiveRecord::Base ... def make_cookie_id_salt(string) secure_hash("#{self.id}--#{string}") end def secure_hash(string) Digest::SHA2.he

我正在运行RubyonRails3,我知道为了用户身份验证而设置cookie值所使用的代码是否足够强大

在我的模型中,我有:

require 'digest'

class User < ActiveRecord::Base
  ...

  def make_cookie_id_salt(string)
    secure_hash("#{self.id}--#{string}")
  end

  def secure_hash(string)
    Digest::SHA2.hexdigest(string)
  end
end

它够结实吗?如果没有,我如何改进它(举个例子)?

我建议使用Authlogic gem,而不是尝试创建自己的。只需几分钟的配置,您就可以获得完整的身份验证解决方案,包括cookie等。如果您真的想自己动手,请安装Authlogic gem,看看他们是如何做到的

是另一种选择。它是非常可配置的,非常干燥,非常令人疲惫


现在我更喜欢它而不是Authlogic

放入cookies的所有内容都存储为纯文本

如果设置cookie,然后在浏览器中检查cookie,您会注意到(在您的情况下,cookie名称将是当前用户id),它由一个字符串表示,如:G8gcm9sbCB5b3VyIG93biBhdXRoIHRvIGt。。。(不完全是纯文本,对吗?它实际上是Base64编码的,但您可以很容易地读取它-require('Base64');Base64.decode64(string))

Rails存储一个特殊的“yourapp”会话cookie,用于检查cookie的有效性。例如,如果某人/某事试图修改它,它将被拒绝

现在在你的情况下,你是否尝试在饼干中散列一些东西并不重要。 它只是用于身份验证(通过用户id在数据库中查找用户),并且您没有存储任何唯一的机密数据(无论如何,您不应该将其放入cookie中,但这将是散列某些内容的唯一原因)

当然,有人可以窃取用户的cookie(如果他使用的是公共计算机,并且没有清除缓存等),然后登录,但没有办法防止这种情况发生(无论使用何种哈希来阻止它)


总之,您应该对现有的内容满意。

谢谢,但您没有回答问题。谢谢,但您没有回答问题。@user502052,虽然他们可能没有直接回答您的问题,但他们告诉您,使用经过良好测试的身份验证解决方案比使用自己的身份验证解决方案要好。如果您缺乏身份验证方面的专业知识,并尝试编写自己的身份验证,并且不得不询问您是否做对了,那么很有可能您没有这样做。你现在的选择是忽略给出的答案,并使用你的解决方案运行,看看你是否做得对,如果你没有做的话,可能会遭受黑客攻击,或者,看看其他解决方案并从中学习。这是你的选择,我哪里会错?我的目标是让我的应用程序几乎可以编写所有的代码(这是正确的方法吗?)。我不知道,但我认为最好有专有代码,独立于其他插件和gem,并有一个一致的和众所周知的软件。为什么要使用第三方代码?附言:谢谢你的建议。@user502052,如果你真的相信这一点,那么你在这个领域就注定要失败。那你为什么要用Rails呢?Desive和Active有什么不同?Rails中已经集成了什么?杂种阿帕奇?韦布里克?如果事实上你只是在尝试学习,而这不是一个真正的应用程序,你可能已经得到了一个答案,如果你说,这本身就是一个好问题。我投了更高的票。真正的应用程序的问题是,如果有100人编写自己的认证,这意味着有80个新的可黑客应用程序出现在网络上。这就是为什么不。
cookies.signed[:current_user_id] = { :value => [@user.id, @user.make_cookie_id_salt(@user.id)], :expires => 15.days.from_now }