什么是最安全的Devise配置?

32

我即将在我们公司为处理敏感信息的员工设置一个仅限内部使用的Rails应用程序。该应用程序将有防火墙、物理安全措施等。我目前关注的是应用程序的登录过程。

我想使用Devise进行身份验证。Devise的最安全配置是什么?

我考虑执行以下操作:

  • 在少量失败的登录尝试后锁定帐户
  • 使用config.paranoid,这样攻击者无法确定他们是否猜测出有效的电子邮件地址
  • 可能禁用电子邮件密码重置?

以下是我不确定的一些具体事项,其中包括从devise.rb中引用的内容:

  • Peppers. Devise有一个选项可以"设置一个pepper来生成加密密码"。我的理解是,这是一个单个的应用程序特定值,它会在哈希之前将类似于"password123"这样的愚蠢密码转换成类似于"password123K#(!@akdlwekdf"或"*%!kd39gpassword123"之类的值。这旨在防止彩虹表攻击,但是根据这篇文章,它不如每个密码的唯一盐。然而,这篇文章这篇论文称bcrypt已内置盐。在使用bcrypt时,使用pepper是否真的有用?我可以,并且需要也能有一个salt列吗?
  • 拉伸(cost)。根据 这个问题,bcrypt的默认密码哈希成本为10。基于我想使用工作因素(work factor)为12,这样合理吗?
  • 密码长度。通常来说,较长的密码更安全,但我不希望它太难以记忆,用户只能将其写在纸上。如果我们使用bcrypt,密码长度是否很重要?
  • SSL cookies。对于启用SSL的公共应用程序,将cookie标记为“仅可通过HTTPS传输”可防止像Firesheep那样的攻击。但我不确定为内部应用程序获得安全证书是否有意义。这样做是否愚蠢?
  • 还有什么遗漏的吗?

  • 2
    SSL并不愚蠢。在通过网络发送登录凭证时,它始终非常重要。 - user229044
    4
    我有同样的问题。你能否发布一个自我回答,分享你学到了什么以及你使用了什么? - KobeJohn
    2个回答

    21

    辣椒: 是的,你说得对。如果使用盐,则添加辣椒不会增加太多的安全性。

    拉伸: 12是合理的,但bcrypt仅确保恒定时间。您应考虑使用更新的 scrypt,因为它允许您指定恒定时间和要使用的内存量。 在密码学上,bcrypt 和 scrypt 大致相同,但是 scrypt 使暴力破解更加困难。

    密码长度: 强制任何类型的密码规则都会降低密码的熵。唯一的限制应该是最小长度,并且许多研究建议至少8个字符。

    SSL Cookies: 如果可以,请使用它们。 安全始终应该从一开始就构建,而不是后来添加。 您永远无法确定谁可能在嗅探您的内部网络。 仅因为您认为没有外部人可以嗅探数据,这并不意味着内部员工不会出于某种原因进行嗅探。 您有责任保护自己的员工免受内部威胁和外部威胁。


    如果你想要一个可以用于Devise的可加密scrypt类,我已经写好了一个。你可以使用并改进它。 - chris
    3
    我的理解是,“pepper”是一个应用程序范围内的单一盐,可以与用户特定的盐一起使用,并驻留在应用程序代码中(而不是数据库中)。理论上,如果数据库被攻击但应用程序代码没有受到攻击,这可能会有所帮助。但最好还是将其视为类似于bcrypt或scrypt的额外措施。 - Nathan Long
    1
    如果项目是开源的,那么在盐的顶部放一些胡椒是否是个好主意呢?因为如果你的数据库被攻击了,攻击者就可以访问到你的哈希密码(包括它们的盐)和加密方案。但是如果你有一个胡椒,它很可能不会被提交到项目中,这将是另一层安全保障。 - bdwain
    你能再详细解释一下吗?你的观点很好,但对于不了解这些问题的人来说似乎过于主观了。 - schmijos
    2
    在security.stackexchange.com上有很好的理由解释,在某些情况下,peppers可能会有所帮助。 - weston
    显示剩余2条评论

    4

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接