【问题标题】:What is the purpose of the "salt" when hashing?散列时“盐”的目的是什么?
【发布时间】:2010-12-25 11:17:38
【问题描述】:

好的,我正在尝试了解使用盐的原因。

当用户注册时,我会为他/她生成一个唯一的盐,并将其存储在数据库中。然后我用 SHA1 对它和密码进行哈希处理。当他/她登录时,我用sha1($salt.$password) 重新散列它。

但如果有人入侵了我的数据库,他可以看到散列密码和盐。

这比不加盐对密码进行哈希处理更难破解吗?没看懂……

对不起,如果我是愚蠢的......

【问题讨论】:

标签: hash saltedhash


【解决方案1】:

如果您不使用盐,那么攻击者甚至可以在他们侵入您的服务器之前离线预先计算密码哈希数据库。添加盐会大大增加该数据库的大小,从而使执行此类攻击变得更加困难。

此外,一旦他们闯入,他们可以猜出一个常用密码,对其进行哈希处理,然后检查数据库中的所有密码是否匹配。每个用户使用不同的盐,他们一次只能攻击一个密码。

维基百科上有一篇关于salts in cryptography的文章。

【讨论】:

  • 如果你不断地加盐和重新散列多次,这会特别有趣。当然,用户登录会慢一些,但即使知道盐尝试暴力破解密码也是不可行的。
  • @StrixVaria:重新连接盐和重新散列与简单地连接多次盐有何不同?我认为这不会为您提供任何额外的安全保障。
  • 只是因为蛮力尝试中的每个“猜测”都需要额外的时间。如果您散列 x 次,则每次猜测需要 x 倍的时间。随着 x 变大,可以尝试的猜测次数会减少。
  • 所做的只是增加生成彩虹表所需的时间。一旦我有了表格,查找哈希(盐 + 哈希(盐 + 密码))并不比查找哈希(盐 + 密码)慢。
【解决方案2】:

使用 salt 的另一个目的是确保使用相同密码的两个用户最终不会在 users 表中拥有相同的哈希值(假设他们的 salt 不相同)。但是,盐和密码的组合最终可能会导致相同的“字符串”或哈希,并且哈希将完全相同,因此请确保使用盐和密码的组合,而两种不同的组合不会导致相同的哈希。

【讨论】:

    【解决方案3】:

    如果攻击者创建giant table of hash values for plaintext passwords,使用盐可以防止他使用同一张表破解多个密码。攻击者必须为每个盐生成一个单独的表。请注意,要使其真正正常工作,您的盐应该相当长。否则攻击者的预计算表很可能包含盐+密码哈希。

    【讨论】:

      猜你喜欢
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 2011-07-30
      • 1970-01-01
      • 2015-07-23
      • 2011-02-27
      相关资源
      最近更新 更多