【问题标题】:why salt did not help when using dictionary attack为什么使用字典攻击时盐没有帮助
【发布时间】:2012-02-09 23:21:26
【问题描述】:

来自本站http://codahale.com/how-to-safely-store-a-password/:

请务必注意,盐对于防止字典攻击或蛮力攻击毫无用处。

如果盐不能防止字典攻击,为什么要使用盐?

【问题讨论】:

    标签: security hash saltedhash


    【解决方案1】:

    对于单个密码,它并没有太大的区别。暴力破解未加盐的密码与暴力破解加盐密码一样困难。您只需尝试按键直到获得成功。

    不同之处在于存在大量密码时,例如在泄露的数据库中。基本思想是在破解许多密码时可以重复使用部分必要的计算。这是通过构建彩虹表来完成的。这样做的计算成本很高,但一旦完成,攻击者就可以相对快速地破解大量密码。使用彩虹表破解 N 密码比单独暴力破解 N 密码要快得多。

    如果每个密码都使用单独的盐进行哈希处理,您就不能以同样的方式重复使用信息。您仍然可以构建彩虹表,但它们只能用于数据库中的一个密码,这使得它们毫无用处。所以为了破解N密码,你真的必须单独暴力破解所有N密码,这对于攻击者来说通常是不切实际的。

    对于无盐密码和流行的哈希算法,您可以简单地从互联网上下载预先计算好的彩虹表,这样攻击者甚至不必自己计算它们。他可以下载一个表格并查找特定哈希的密码。盐可以防止这种情况。

    无盐散列也有一个缺点,即具有相同密码的两个用户的密码散列是相同的。因此,如果攻击者发现多个用户具有相同的密码哈希,他只需破解该密码一次。

    【讨论】:

      【解决方案2】:

      如果“攻击者”拥有您的网站/应用程序使用的密码哈希(和盐),他们将简单地暴力破解“盐”+“密码”。

      但是,使用盐可以提供更多针对彩虹表(预先计算的哈希表)的保护,因此它们仍然值得使用。

      【讨论】:

      • 但是攻击者在找到匹配项后如何知道哪一部分是盐,哪一部分是真实密码?
      • 如果您的站点/数据库已被破坏到足以让攻击者获取用户散列密码,他们可能也可以访问盐。
      【解决方案3】:

      盐可以防止通过彩虹表从字典中即时破解;这篇文章和后续文章指出,CPU/存储的权衡现在使得彩虹表没有意义,所以盐对你没有帮助。当然,他们从来没有帮助过暴力攻击。

      【讨论】:

      • -1 盐渍对暴力攻击和彩虹表一样有效!但是盐一定是未知的。为了防止重复密码哈希,许多系统使用唯一的盐。然后将其包含在数据库中。如果数据库泄漏,盐几乎和无盐一样无用。添加第三种应用特定的盐。是一种有效的解决方案,但不能将其存储在数据库中或使其无用。当然,如果黑客可以访问文件系统,你又遇到麻烦了
      【解决方案4】:

      出于说明目的,假设您使用 2 个字符串作为盐,它可以是集合中的随机元素
      salts = {'00', '01', '02'...... '99'}

      你使用的公式是:

      salt = salts[rnd(100)]      # gets a random element from the set above, say '87' 
      password_hash = MD5(password + salt) # say the hash is 'dai480hgld0'
      

      之后,您将在数据库中保存哈希和盐,类似于

      +---------------+ |密码哈希 |盐| +---------------+ | dai480hgld0 | 87 | | sjknigu2948 | 23 | | . | . | | . | . | +--------------------+-----+

      我们假设在受感染的系统中,攻击者可以访问您的代码 - 因此他知道您是如何计算哈希值的。
      攻击者还可以访问您的数据库,因此他拥有所有密码哈希和盐。

      鉴于此信息,为了破解您的密码(具有哈希:'dai480hgld0'),他必须执行以下操作:

      for word in dictionary_words #iterate over all the words in dictionary
        for salt in salts          #iterate over all possible salts (100 iterations)
           password_hash = MD5(word + salt)
           if password_hash == 'dai480hgld0'
             print "The password is " + word
             exit()  
           endif
        next
      next
      

      请注意,如果您根本不使用任何盐,算法将是

      for word in dictionary_words #iterate over all the words in dictionary
        password_hash = MD5(word)
        if password_hash == 'dai480hgld0'
          print "The password is " + word
          exit()  
        endif
      next
      

      从上面的两个代码示例中,很明显在密码中添加盐会增加暴力攻击的尝试次数。在我们的例子中,因为有 100 种可能的盐,所以你让攻击者用 100 种盐尝试每个单词。

      所以,总结一下:

      • 盐很好。它们使您的密码难以破解。即使您的用户输入了弱密码,salt 也会确保生成的哈希值不可谷歌搜索。例如,很容易用谷歌搜索一个哈希“3cc31cd246149aec68079241e71e98f6”,它实际上是一个相当复杂的密码,几乎可以满足所有密码策略。仍然破解它不需要一行代码!

      • 盐不是灵丹妙药。它们只是增加了破解者暴力破解您的密码所需的时间。但是,如果你的盐地址空间相当大,那么你就很好了。例如,如果你有 32 个字符的字母数字字符串作为盐 - 蛮力真的需要很长时间。

      • 像 bcrypt 这样的慢速算法可以在这方面为您提供帮助,因为它们很好……“慢”。对于蛮力攻击,破解计算缓慢的哈希将花费不切实际的时间。

      【讨论】:

        【解决方案5】:

        Salt 使加密更强大。但是,字典攻击不会尝试解密密码哈希,所以加盐或不加盐都没关系,它们只会尝试多个密码,直到一个有效。

        【讨论】:

        • 这是不正确的。首先,我认为您的意思是 Salt 使散列更强大。几乎没有理由使用带加密的 Salt。盐被用作单向函数的输入之一,以使破解密码或密码数据库变得更难(通常更慢)。此外,是否使用盐进行字典攻击也很重要。如果你不使用盐,黑客只需要对每个密码猜测进行一次散列并将其与所有散列进行比较,而充分利用盐(每个密码都有一个单独的盐)你不能这样做。
        【解决方案6】:

        现在这似乎不是一个编程问题,所以我只是给你一些关于加盐和加密的信息:

        加盐的目的是帮助像散列这样的单向函数,它在密码学中被广泛使用,由于难以猜测而经常使用密码,并且其他攻击(如暴力攻击)需要时间破解它们。

        如果您想安全地存储密码,最好的方法肯定是加密。在 Wikipedia 上查找加密以获取更多信息。

        【讨论】:

        • -1。如果您不需要能够恢复密码,那么您绝对不想加密它们,而是想要散列(或者,更好的是,使用类似散列的东西,例如 bcrypt)。但是......永远不要使用可逆的加密,除非您确实需要能够恢复明文密码(这不是一个非常常见的用例)。
        • 我假设他想存储他的密码以供以后使用/访问,这就是为什么我建议加密,如果他出于任何原因不想恢复它,像散列这样的单向函数绝对是要走的路。如果您要-1,请确保您知道我的意思。当我说安全存储时,我的意思是存储以备后用/恢复。
        【解决方案7】:

        这并不完全准确,因为大多数事情取决于您的假设。

        主要假设是:

        1. 攻击者有盐
        2. “即时”计算哈希值非常快(与 salt 一样,他需要重新计算所有值,并且无法使用预定义的列表)
        3. 每个用户使用相同的盐。

        【讨论】:

          【解决方案8】:

          两个cmets:

          1. 可以迭代常规哈希算法。没有必要仅仅因为你想增加工作因子而使用非标准的算法。

          2. 建议使用 Salt,即使您使用慢速哈希方法。它可能不一定会增加最佳攻击的工作量,但如果用户选择与其他用户、其他帐户或旧密码相同的密码,它会阻止普通攻击。

          【讨论】:

            【解决方案9】:

            这属于 security.stackexchange.com

            问题在于计算能力与散列算法的速度相结合。基本上,他在推销 bcrypt,这很慢。

            如果黑客同时使用了哈希和盐,并且知道用于哈希密码的算法,那么破解它只是时间问题。

            如果使用非常快的算法,那么这个时间就很短了。如果使用极其缓慢的算法,那么显然要花更长的时间来找到命中。

            这使我们首先想到了为什么要对事物进行哈希/加盐的主要原因:争取时间。可用于更改所有列出的密码的时间,以及联系所有用户让他们知道的时间,以防他们需要在其他系统上更改密码。

            我们使用盐的原因是为了迫使黑客每个盐值构建一个彩虹表。这样,一张表就不能用来破解你所有的密码。这样做的唯一原因是为了争取时间,并希望阻止普通黑客投入更多资源来破解所有黑客。

            散列密码,无论使用何种机制,在大多数人接受这个词的意义上都是不安全的。安全并不意味着“永远不会被破解”。相反,它的意思是“就破解的时间/精力而言,这将是昂贵的”。对于大多数黑客来说,他们只想要明文等容易实现的目标。对一些人来说,他们会走到任何需要的极端,例如为每个盐值构建大量彩虹表以获取所有数据。

            当然,支撑这一点的是是否在您的用户表中轻松识别任何“超级”用户帐户。对于大多数系统来说,只要破解 sys admin 类型的帐户就足够了,因此每个用户使用不同的 salt 值这一事实并不重要。聪明的人只会打扰那个帐户。

            【讨论】:

              猜你喜欢
              • 2010-09-30
              • 2011-11-02
              • 2012-07-04
              • 1970-01-01
              • 2010-11-09
              • 2012-03-26
              • 2011-03-24
              • 2014-01-13
              相关资源
              最近更新 更多