【问题标题】:One way functions, Hash algorithms单向函数,哈希算法
【发布时间】:2017-09-03 19:22:51
【问题描述】:

基本上单向函数有两个属性: 1. 不可逆 2. 防碰撞(这意味着没有两个相同的词具有相同的哈希值,如果我错了,请纠正我)

另一方面,我看到加盐哈希密码用于为密码的哈希值提供更高的安全性,并为具有相同纯值的密码提供冲突避免。

那么为什么会发生这种情况,哈希函数不应该具有抗碰撞性,为什么当哈希函数已经具有该属性时,Salt 必须提供这个?

提前谢谢你。

【问题讨论】:

  • 想象一下,我知道你使用 SHA256 哈希函数。您的一些用户选择了非常弱的123 密码。如果你不放salt,我可以用brute force(或rainbow tables)打破它:我会运行@所有短字符串(包括123)上的987654323@并找到密码。
  • 加盐密码哈希与冲突无关。每用户盐保证如果两个(或更多)用户具有相同的密码"foo",他们的密码哈希将完全不同。因此,攻击者在猜到其中一个用户的密码后,并不会自动获得使用相同密码的所有其他用户的访问权限。

标签: security hash hash-collision saltedhash


【解决方案1】:

如果单向哈希函数真的是单向的,那就太好了。

如果两个用户选择相同的密码会发生什么?没有盐,它们得到相同的哈希值。

你猜怎么着?人们不擅长选择密码。这些内存有限且缺乏自然内部密码随机性的生物通常选择短、低熵和暴力破解的密码。

如果您想破解不涉及盐的密码的哈希,那么只需Google it

盐有助于解决问题,但它不是灵丹妙药。使用 salt,假设两个用户的 salt 不同,选择相同密码的两个人不会获得相同的密码哈希。盐还有助于防止rainbow table attacks,这是破解密码的时间-记忆权衡。

不过,这并不能解决所有问题。如果您的数据库公开,salt + 加密哈希是不够的,因为攻击者仍然可以brute force-passwords using low cost GPUs

那么解决方法是什么?您不仅需要盐,还需要暴力破解是一个缓慢的过程。这就是为什么我们不使用哈希函数作为密码,而是使用password hashing functions。不要因为愚蠢的术语而责备我,我完全同意。底线:从 bcrypt、scrypt、argon2、pbkdf2 中选择。我个人推荐 bcrypt。

【讨论】:

    【解决方案2】:

    只想在@TheGreatContini 的回答中添加一个细节。

    1. 对于没有加盐的散列密码,您可能会发现 已经预建了彩虹表。
    2. 如果您对所有密码使用单一盐,攻击者必须使用此盐构建 1 个彩虹表, 获取所有密码。
    3. 如果每个密码都有唯一的盐,攻击者将不得不为每个密码构建一个彩虹表。构建一个仅获取 1 个密码的完整彩虹表是没有意义的,这就是为什么我们可以说唯一盐可以防止彩虹表攻击。

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 2017-12-26
      • 2016-03-05
      • 1970-01-01
      • 2013-01-02
      • 2017-03-05
      • 2012-06-03
      • 2011-12-14
      • 2021-05-03
      相关资源
      最近更新 更多