代码之家  ›  专栏  ›  技术社区  ›  Thomas O

有人能解释盐在存储哈希密码时是如何起作用的吗?

  •  7
  • Thomas O  · 技术社区  · 14 年前

    当密码数据库或其他重要信息被破坏时,我很难理解附加到哈希的salt如何帮助提高安全性。

    例如,如果salt是“hello”,并附加到密码“password”中,则salt和密码将存储在一起,“hello password”并进行哈希以生成:

    94e66f94517d606d5ad6d9191b980408952f2ed2 (sha1) 
    

    然后附上盐:

    hello$94e66f94517d606d5ad6d9191b980408952f2ed2
    

    如何更安全?攻击者知道salt,因此现在可以轻松计算密码…正确的?或者我是从根本上误解了什么?

    3 回复  |  直到 14 年前
        1
  •  8
  •   Jon Skeet    14 年前

    不,不是有“小小的额外困难”——潜在的更大的困难。

    假设有20亿个常用密码。很容易散列所有这些并存储结果。如果你有 未加盐的 密码散列,您只需检查与给定散列匹配的常用密码。

    现在把它和腌制的土豆泥比较一下…现在您有20亿个常用密码,但也有几十亿个可能的盐。计算 全部的 可能的salt/password组合需要很长的时间-希望是不可行的。

    另外,这意味着即使两个人拥有相同的密码,他们也很可能拥有不同的散列值-因此一个用户在泄露密码时的疏忽不会危及另一个用户的安全。

    Wikipedia entry (如果您还没有)了解更多信息。

        2
  •  6
  •   Zippit    14 年前

    盐有两种帮助:

    1)当两个(或更多)人使用相同的密码时,如果没有盐,您可以看到谁使用相同的密码(哈希值都是相同的)。所以在理论上,如果那个人知道其中一个密码,他就知道每个人的密码都有相同的哈希值。这是一个次要的原因。

    2)主要原因是防止字典攻击或彩虹攻击。在这些攻击中,有人使用预先计算好的哈希数据库作为常用密码。通常这些数据库的大小都是gig。但是,在这一点上,只需根据预先计算的哈希列表查找您拥有的哈希(哈希密码),并查看关联的密码是什么,就非常容易了。

    通过使用salt值(通常您希望它是一个随机数),散列值将与字典不匹配(它们用所有可能的salt值预先计算所有密码的可能性以指数形式更为困难)。因此,即使您的用户使用容易被攻击的密码,也要说“密码”,这在任何密码字典/彩虹表中都是很有保证的,通过预先挂起随机salt值,您可以保证哈希对攻击者毫无用处。同时,对于您来说,由于salt只是存储在明文中,所以您可以很容易地将其添加到明文中,以便比较用户输入的密码。

        3
  •  3
  •   Gordon Gustafson    14 年前

    salt没有附加到散列,而是附加到密码,然后进行散列。这是更安全的,因为黑客必须知道salt和实际的密码,这两个密码都应该受到严格的保护。D