代码之家  ›  专栏  ›  技术社区  ›  Tony

哈希密码和salt密码是否安全,以防字典攻击?

  •  9
  • Tony  · 技术社区  · 16 年前

    我知道salts对不同的值使用相同的密码哈希。但是,盐通常用密码存储在数据库中。因此,假设我是攻击者,下面介绍我如何使用字典攻击salt(注意,在本例中,为了简洁起见,我不会写出128位散列或salt):

    user_pw = 'blowfish'
    
    Given:
    email = 'blah@blah.com'
    hash = '1234567890'
    salt = '0987654321'
    
    function attack(){
      for each(word in dictionary)
        md5( word * salt ) == hash ? cracked_one(email, word)
    }
    

    我知道这可以防止黑客使用彩虹表……但似乎不能防止字典攻击。我想你可以在散列算法中添加其他东西,但是有了安全性,我们必须假设攻击方法是已知的。

    因此,Salting似乎可以防止黑客找出哪些密码可能是字典密码(多个用户拥有的密码),并防止彩虹攻击……但不能防止字典攻击。

    这是正确的分析吗?有没有更好的安全建议?

    谢谢!

    5 回复  |  直到 16 年前
        1
  •  10
  •   Steven Sudit    16 年前

    salt不能防止字典攻击,只是预先计算好的字典攻击。尤其是防彩虹桌( http://en.wikipedia.org/wiki/Rainbow_table )同时确保破解一个用户的密码不会自动让你破解任何共享该密码的用户。

    我链接到的文章提到了一些改进盐渍的方法,包括关键的强化( http://en.wikipedia.org/wiki/Key_strengthening )

        2
  •  4
  •   Kevin Montrose    16 年前

    没有什么能阻止攻击者猜测密码。

    盐类只会迫使攻击者根据每个用户(实际上是每个盐类)来散列字典,从而使攻击变得更加困难。

    为了提高安全性,最好使用可调哈希函数。增加每个散列的时间,使得字典攻击在攻击者可能拥有的任何硬件上都不切实际。

    基本上, read this .

        3
  •  1
  •   Jared Oberhaus    16 年前

    没错。如果有人获得了密码资料,字典攻击将是有效的。

    为了防止这种情况发生:

    • 确保您的密码不受字典攻击。
    • 确保您的密码文件( /etc/shadow )只能通过根目录读取。
        4
  •  1
  •   Eric    16 年前

    如果没有salt,攻击者可以为其词典中的每个单词生成哈希,然后根据密码列表运行新词典。

    使用salt时,每个密码都会使用一个随机字符串进行散列,因此即使使用之前散列的词典知识,他仍然需要为数据库中的每个不同salt重新创建一个包含salt的新散列词典。

    只需将字典表视为彩虹表的一个子集(小部分)。虽然彩虹表可以包含数十亿个条目,但词汇表包含“已知单词”,所以最多可能有几百万个条目。

    彩虹表失败的原因是因为重新创建的过程将是重新计算“数十亿条条目”,而字典攻击仍然是“数百万条条目”。盐只会阻塞预先计算的值。

        5
  •  0
  •   dreadwail    16 年前

    你的逻辑是合理的,但事实上,有了足够的计算能力和时间,就无法抵御字典/暴力攻击。