【问题标题】:How secure is the "Authentication from Scratch" from Railscasts?Railscasts 的“从头开始验证”有多安全?
【发布时间】:2011-12-22 00:59:04
【问题描述】:

我正在权衡使用“从头开始的身份验证”(在此 Railscast 中实现)与使用 Devise 的优缺点。

我使用的是自定义数据存储,因此使用 Devise 并不像按照自述文件那么简单。这需要写一个custom ORM adaptor,这绝非易事。

鉴于这一切,从头开始的 Railscast Auth 似乎更容易实现。

那么它的安全性如何?

更新:我应该指出我正在使用 Parse.com 作为我的数据存储。这意味着他们负责散列密码和限制用户名的唯一性。

【问题讨论】:

  • 您使用的是 Rails 3.1 吗?如果是这样,那就更容易了:railscasts.com/episodes/270-authentication-in-rails-3-1。我发现很难回答你关于它有多安全的问题。你期待什么样的答案?
  • 我不确定会得到什么样的答案。这是那些“未知的未知数”类型的问题之一。

标签: ruby-on-rails ruby authentication devise


【解决方案1】:

它们都通过使用 bcrypt 生成密码的加盐散列来工作,唯一的区别是设计(默认情况下)使用更高的散列成本(即它需要更多的 CPU 周期来强制它),但是当然,您可以轻松地将其添加到 railscast 代码中,在这方面大致相同。

railscast 版本似乎确实容易受到计时攻击,因为只是执行 == 不会给您一个恒定的时间比较操作。简而言之,定时攻击是有效的,因为哈希完全错误的密码比前半字节正确的密码需要更少的时间来拒绝 ==(因此 == 在保释之前必须考虑更多字节)。似乎任何此类差异都会被网络延迟等变化带来的噪音消除,但人们已经发起了真正的攻击来使用这些方法恢复密钥。

您显然可以从设计中借用安全比较位,但它确实表明存在不明显的问题。

显然设计为您提供的不仅仅是身份验证!

【讨论】:

  • 关于你在这里描述的定时攻击的快速问题......据我所知,定时攻击要求你能够迭代比较的输入,所以如果你得到前 n 个字符对,您应该能够只修改第 n+1 个字符以进行后续猜测。也许我错过了一些东西,但是这将如何在这里工作?如果密码正在被散列(使用 any 散列算法),您不能简单地修改第 n+1 个字符来迭代攻击。这样做会让你获得一个全新的哈希值。由于您没有比较攻击者控制的输入,因此我不确定定时攻击将如何工作。
  • 也许不会,说实话也不一定。
  • 但你可能是对的 - 可能是我反应过度
【解决方案2】:

该截屏视频使用 bcrypt-ruby 库,它是基于 Blowfish cipherbcrypt 的 Ruby 实现。 bcrypt 的好处是破解该系统生成的密码在计算上是昂贵的,并且生成这些密码的成本可以根据需要增加,以使其更安全,代价是计算时间生成时间。

如需更多信息,请查看BCrypt::Password RDoc。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多