在散列中,盐的随机性是否重要?

信息安全 哈希
2021-08-16 05:31:20

我最近在一次在线讨论中对我发表了评论,此前我曾说过盐中的随机性无关紧要——我得到了以下回复:

盐可能不必是“安全的”,但生成的方法可能很重要。使用加密随机数据源有助于确保盐数据的唯一性和随机性。根据所使用的算法,盐中随机性的分布可能会影响密钥的强度。

现在,在大多数情况下,使用 22 个字符的盐(例如在 bcrypt 中)即使使用 prng 两次生成相同盐的几率也很小,但它是该语句的第二位 - 我不确定这意味着什么如果不理解它,我当然不能说它的“错误”....

那么这是正确的吗?盐的随机性重要吗?由于如果有人攻击哈希表,盐是已知的,那么盐的质量如何?

4个回答

不,盐应该是唯一的,因此您不能使用计算密码哈希一次并将该结果用于多个密码哈希的攻击(例如彩虹表)。

如果您有兴趣在没有一些秘密知识的情况下使反向哈希成为不可能,那么在哈希之前将特定于站点的密码附加到提供的密码(除了盐之外)。哈希一起存储,因此难以猜测是没有意义的。

@Honoki
如果它是全球价值或特定于站点的,那么您想到的不是盐,而是其他东西。这并不是说这不是一个好主意,但它不是盐。通常,特定于安装的机密称为“站点密钥”或“站点密码”。

但是盐通常与哈希一起存储。例如,这是当前存储 Unix/Linux 登录密码的方式。这里的密码是“foobar”:

$5$BcjmguyyH.Qrf$ADRXhi/5xb.dYU67I.JdY57uoFjel/rqMqj14QJmTQ1
  • $ 是字段分隔符
  • 5 是哈希算法说明符(在本例中为 SHA-256)
  • BcjmguyyH.Qrf 是盐(不以任何方式伪装)
  • ADRXhi/5xb.dYU67I.JdY57uoFjel/rqMqj14QJmTQ1 是哈希

鉴于盐的目的是防止攻击者预先计算散列,我想说重要的是盐的唯一性,但随机性可能是一个特别足智多谋的攻击者的一个因素——如果你的盐是非常可预测的,那就是可以想象,攻击者可以在入侵尝试之前生成彩虹表,以便在获得哈希值后加快破解密码的速度。

有些技术比无盐密码好一点——对整个密码数据库使用单个盐意味着他们只需要计算一组散列来破解整个数据库,并使用可预测地从用户名(或实际用户名)派生的盐意味着攻击者可以预先计算他们有兴趣破解的用户帐户(可能是您的管理员帐户、特权员工、版主帐户等)的哈希值,甚至在他们获得数据库副本之前。

总之,盐需要是唯一的,并且它们需要不可预测以获得最佳安全性。随机性的加密标准可能不是必需的,尽管它们是保证不可预测性的好方法。

盐不需要是唯一的。这不是绝对的要求。但是,您使用的不同盐越多,安全性就越高,因此如果它们几乎是唯一的,那很好,但不要担心某些人可能会由于随机性差而共享盐。

Salt用于防止人们使用预先准备好的彩虹表来破解您的密码。如果您在每个密码上使用相同的盐,您已经挫败了预先准备好的彩虹表,但可能值得破解者花时间为您的加盐密码创建自定义彩虹表。如果您为某些用户更改盐,那么您会降低破解者在制作彩虹表时的潜在收益。例如,如果你随机使用了两种盐,那么破解者需要创建两个彩虹表。如果你随机使用 50 种盐,那么破解者需要创建 50 个彩虹表——得到更多的工作。如果您为每个用户使用随机生成的盐,破解者必须为每个用户重新创建一个新的彩虹表。现在这项工作太多了,破解者不会费心去尝试,而是使用不同的攻击。

如果您为每个用户随机生成了盐,则有可能两个或多个用户的盐是相同的。这只会略微影响网站的安全性。破解者现在可以使用自定义彩虹表来破解所有相同的加盐密码。如果具有相同盐的用户数量足够大,这可能是一种可行的攻击。如果相同盐的数量在单个数字中,则不会造成大问题。

盐的价值不必是秘密。隐藏盐值是由某些人完成的,但主流密码系统通常不会。将盐保密并不能提供太多额外的安全性。salt的目的是确保每个用户的密码算法不相似,从而阻止彩虹表攻击。只要盐通常几乎是唯一的,知道盐不会使哈希更容易破解。

在大多数密码散列方案中,盐必须是全局唯一的这意味着,理想情况下,全世界的每个单独的密码实例都应该有自己的盐值,不与其他人共享(特别是,相同的盐值不应该在两个不同的服务器上使用,并且盐值也必须在以下情况下更改)用户更改他的密码)。

全球性、全球性的唯一性很难,因为没有分配盐的中央存储库。一个简单的方法是依赖随机性:如果您从加密强大的随机生成器(即“非常好的”生成器)生成盐,并且如果您使盐足够长,那么盐碰撞的可能性非常低 - 足够低到可以忽略。请注意,即使我们的目标是全局唯一性,偶尔的碰撞也不会立即致命,因此我们可以承受这种风险。16 个字节“足够长”。

任何可靠地保证全局唯一性的方法都是好的;但随机性通常是扩展性最好的,因为它纯粹是本地的(没有网络范围的瓶颈)。

Mutatis mutandi,这与UUID的问题相同。“版本 4”UUID 实际上是 122 个随机位。这样的 UUID 将是非常合适的盐。