【问题标题】:How does a salt protect against a dictionary attack? [duplicate]盐如何防止字典攻击? [复制]
【发布时间】:2011-11-02 23:16:23
【问题描述】:

可能重复:
What is the purpose of salt?

我刚刚阅读了一些关于盐的使用的信息,我一直在阅读的示例给出了在散列之前为密码添加盐以防止字典攻击。

但是我真的不知道这有什么帮助 - 如果攻击者可以访问密码的哈希值(就像他们在我一直在阅读的示例中所做的那样),他们很可能也可以访问 salt。 因此,攻击者不能在遍历字典以查看它是否与哈希匹配之前,将盐添加到字典中的每个项目之前并将其添加到字典中吗?所以他们必须多次遍历字典,这似乎没有多大的保护增强作用?

【问题讨论】:

    标签: security cryptography passwords salt


    【解决方案1】:

    字典攻击是一种攻击,其中攻击者获取大量密码,可能按可能性/概率排序,并为每个密码应用算法,检查结果。

    在加盐密码的情况下,如果攻击者拥有加盐密码(通常假设),这种攻击仍然可能(而且成本不会显着增加):只需在您的算法中输入加盐即可。

    盐可以防止的,是彩虹桌。 彩虹表是包含明文对(例如密码)和相应散列的表,按散列排序。这样的表允许在给定哈希的情况下简单地查找密码。

    生成彩虹表是一个代价高昂的步骤(取决于用作输入的字典的大小),但之后您可以使用它来查找所需数量的密码,而无需任何费用。

    由于盐可以防止这种情况,因为您现在需要为每种盐创建一个单独的表。即使使用简单的 Unix crypt 的 2 字母盐,这已经是 3,844 倍。现代密码哈希算法使用更大的盐(例如 bcrypt 使用 128 位盐,其系数为 2128。)

    为了防止字典攻击,您将使用慢速散列算法,而不是像简单的 MD5 或 SHA1/SHA2 这样的快速算法。 Bcrypt 就是这样一种算法(具有可配置的工作因子),同一作者后来提出了 scrypt(不仅需要很多时间,而且需要大量内存,而攻击者往往没有那么多的处理能力)。

    【讨论】:

    • 这是否意味着盐可能不是一些随机字符串。例如,如果我存储用户密码,我可以将用户名用于盐目的:md5(密码+用户名)?这样可以防止彩虹桌,并且我可以通过不存放盐来保留一些空间。
    • @alexpods 这适用于某些攻击场景,但不适用于所有攻击场景——例如现在,不同应用程序(网站)中的相同用户名-密码组合会产生相同的哈希值。 (另外,请永远不要将 MD5 用于任何事情。)
    • 感谢您的回答! (md5 我仅用于示例目的)但我仍然不太明白:为了获得最佳安全性,盐总是必须是随机的,或者不是。例如,我可以从用户名中获取哈希并对其进行多次迭代(伪代码):哈希(密码 + 迭代(1512,哈希(用户名))。迭代计数特定于我的应用程序。即使攻击者知道算法和迭代计数(他是老公司员工,被解雇了,想要报复)他什么也做不了。至少这不比随机撒盐安全。也许我错了?我的错是什么?
    • 所以我们正在使用盐来增加额外的安全性,以防密码数据库遭到破坏?
    【解决方案2】:

    1- 你不能使用彩虹表来破解哈希

    2- 如果两个用户的密码相同,则加盐后的哈希值会有所不同(因此很难捕获通用密码)

    【讨论】:

      【解决方案3】:

      通过增加密码文件中可能答案的数量确实增加了他们必须做的工作。

      进行字典攻击的一种方法是扫描密码文件。如果没有盐并且您看到“DFGE$%$%£TEW”,那么您知道密码是“PASSWORD”。添加盐意味着您必须使用一个更大的字典,其中包含所有可能的盐的“密码”的所有值,或者您必须花费精力阅读盐并进行加密,这会减慢您的速度。不再是简单的搜索。

      Salt 在多个用户选择相同密码的情况下也有帮助。尤其是在过去所有用户都可以读取密码文件的时代,如果其他用户的密码与您相同,或者与您知道的密码相同,这并不明显。

      【讨论】:

      • 你所说的“字典”就是俗称的“彩虹表”。字典(用于字典攻击)只是一长串可能/可能的密码(没有它们的哈希)。你仍然可以使用这样的列表来攻击加盐密码,它只是比彩虹表攻击慢很多(但仍然比暴力破解快)。
      【解决方案4】:

      实际上盐并不能防止字典攻击。它有以下好处:

      1. 增加破解它的计算成本,因为对于字典中的每个密码,攻击者需要尝试使用所有可能的盐对其进行哈希处理。
      2. 防止具有相同密码的两个用户也具有相同的哈希值。这样,即使同一个文件中有相同的密码,攻击者也必须显式破解所有密码(密码的哈希值总是不同的)。

      【讨论】:

        【解决方案5】:

        字典攻击基于字典中的单词。通过添加随机盐,您不再有字典单词。因此,基于字典单词的密码哈希表对破解密码没有帮助。

        【讨论】:

        • 如果你知道字典的内容,并且你知道salt,那么附加到字典的salt是一个新字典,附加到字典的salt是另一个新字典。因此,您现在知道两本字典了吗?还是有时会在密码中散布盐?
        • 在 UNIX 系统上的 /etc/passwd 中,密码前有两个字符。相同的两个字符存储在密码文件中值的开头。当用户设置他们的密码时,会使用随机盐,因此“PASSWORD”变为“azPASSWORD”并且哈希是(比如说)az12345。然后,当用户尝试登录时,他们键入“PASSWORD”,系统知道使用“az”作为盐。即使盐只有 a-zA-Z0-9,您的字典仍然是 (10+26+26)^2 = 3,844 倍。
        • BiscutWoofington 在正确的轨道上,Teddy 的回答完全是错误的。你可以简单地修改你选择的破解引擎,几乎所有的都是开源的,附加盐值,你就有了魔力。加盐的目的是消除可以快速搜索的预计算彩虹表的威胁,现在我们生活在 EC2 和 GPU 并行化的时代,今天需要破解密码的每个人都可以以非常便宜的价格破解密码。
        • @geteipordietryin 哎哟!我完全错了??您确实将云计算等作为暴力攻击提出了一个有效的观点。
        • 盐可以防止彩虹表,而不是字典攻击。
        【解决方案6】:

        每个盐值都需要不同的字典,因此每个不使用盐的数据库都可以使用同一个字典进行攻击。

        • 没有任何盐,攻击者可以使用现成的 预计算的字典,其中有很多。

        • 如果您的整个数据库只有一种盐,那么他们需要 创建一个特定于您的数据库的字典。

        • 如果每个用户记录都有自己的盐,现在他们需要创建 1 每个用户的字典。

        【讨论】:

          猜你喜欢
          • 2012-07-04
          • 2014-09-12
          • 2017-03-31
          • 2021-11-14
          • 1970-01-01
          • 2021-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多