【问题标题】:Proper salting and using PHPass正确加盐和使用 PHPass
【发布时间】:2012-08-27 10:23:52
【问题描述】:

长期以来,我一直在使用 PHPPass 对我的密码进行哈希处理。我承认仍然有一些我不完全理解(或忽略)正确散列密码的事情,所以今天我正在审查我能找到的所有信息。

查看 PHPass 文档,我已经进入了这个:

除了实际的散列之外,phpass 在新密码或密码被散列时透明地生成随机盐,并将散列类型、盐和密码拉伸迭代计数编码到它返回的“散列编码字符串”中。当 phpass 针对存储的散列验证密码或密码短语时,它同样透明地提取并使用散列类型标识符、盐和“散列编码字符串”中的迭代计数。 因此,您无需自己费心腌制和拉伸 - phpass 会为您解决这些问题。

我把困扰我的句子加粗了。
我一直认为盐应该是秘密的,因为攻击者不应该知道它。因此,如果理解正确,PHPass 会将使用的盐存储在同一个哈希中,以便在比较密码并检查是否有效时能够使用它。
我的问题是

  1. 这安全吗?如果散列被泄露,攻击者拥有用于散列密码的盐......这里有一些我想念的东西。
  2. 我真的可以在这里为密码加盐而烦恼吗?我真的可以依赖 PHPass 吗?

【问题讨论】:

  • 通过添加salt,您又增加了一层安全性。这是Defense in Depth的主要原理。但如果 phpass 已经添加了盐,则不会添加另一层。
  • 1.) 您关注哪种安全性?你能说得更具体一点吗? - 2.) 你能在几分之一秒内用是或否自信地回答以下问题:“Phpass 使用盐吗?” - 说出你能回答的确定性和速度以及答案。
  • @hakra 我指的是存储盐和密码的行为。我一直认为将它存储在不同的地方(例如读取数据库字段)会更好。
  • @Raúl 如何将盐简单地存储在单独的数据库字段中(我假设在同一个表中)以任何显着方式增强安全性?
  • 我知道开发人员会错误地解释 salt,就像 $hash = md5(SECRET_SALT . $user_password) 所做的那样,其中 SECRET_SALT 是整个应用程序中的一个秘密常量。因此,如果攻击者发现它,他/她可以使用它来暴力破解密码,但这不是使用盐的方式。盐应该是随机的,并且对于每个用户来说都是不同的,并且它们是否公开并不重要。

标签: php security phpass


【解决方案1】:

一点背景
盐并不意味着是秘密的,相反,盐通过确保每个使用的实例的哈希结果唯一来“起作用”。这是通过为每个计算的哈希选择不同的随机盐值来完成的。

盐的用意在知道时不会受到损害;攻击者仍然需要分别攻击每个哈希。因此,您可以简单地将盐与密码一起存储。

那么,PHPass 安全吗?
是的! PHPass(根据最佳实践)为您生成强随机盐。这是一个经过充分审查且质量上乘的图书馆。

感兴趣的链接
How to securely hash passwords?
How to store salt?
Password Hashing add salt + pepper or is salt enough?
Salt Generation and open source software

【讨论】:

    【解决方案2】:

    盐的目的不是要保密。目的是为每个散列输入添加一个唯一的组件,因此相同的密码不会散列到相同的散列,从而使暴力破解过程更加困难和耗时,因为必须单独尝试每个散列。

    是的,如果盐是秘密的,它会稍微安全一些,但这在实践中很难实现,因为您的应用程序也需要盐,所以它需要存储在某个地方密码也可以访问。因此,在实践中,当攻击者获得密码哈希时,他通常也能够获得盐。

    【讨论】:

      【解决方案3】:

      如果我理解正确,盐主要用于阻止预先计算的哈希/彩虹表攻击。只要生成使用的哈希值,使其在全球范围内具有合理的唯一性(例如,未在 PHPass 中硬编码),就可以了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        相关资源
        最近更新 更多