散列是如何被破解的

  • 字典攻击和暴力破解(Dictionary and Brute Force Attack)

    字典攻击(Dictionary Attack)
    
    正在尝试 apple        :失败
    正在尝试 blueberry    :失败
    正在尝试 justinbeiber :失败
    ...
    正在尝试 letmein      :失败
    正在尝试 s3cr3t       :成功!
    
    暴力破解(Brute Force Attack)
    
    正在尝试 aaaa :失败
    正在尝试 aaab :失败
    正在尝试 aaac :失败
    ...
    正在尝试 acdb :失败
    正在尝试 acdc :成功!
    

    破解散列的最简单方法是试图猜出密码,对每个猜测进行散列,并检查猜测的散列是否与需要破解的散列相同。如果散列相同,那么猜测的值就是密码。猜测密码的两种最常见的方式是字典攻击暴力破解

    字典攻击使用一些文件,其中包含单词、短语、常用密码和其他可能用作密码的字符串。文件中的每个单词都经过散列处理,并将得到的散列与密码散列进行比较。如果匹配,则这个单词就是密码。这些字典文件是从大量文本中提取出的单词,甚至是使用真实的密码数据库来构建的。字典文件通常会被进一步处理,使其变得更有效,比如使用「leet speak」进行替换(「hello」替换为「h3110」)。

    暴力破解会尝试各种可能的字符组合,直到给定长度为止。这种攻击在计算上非常昂贵,并且通常在给定处理器时间内破解散列的效率最低,但最终总能找到密码。因此密码应该足够长,使得搜索所有可能的字符串来找到密码会因为花费太长时间而变得不值得。

    没有办法防止字典攻击或暴力破解。虽然可以让它们变得不那么有效,但没有办法完全阻止它们。如果您的密码散列系统是安全的,则对每个散列实施字典攻击或暴力破解是破解散列的唯一方法。

  • 查找表(Lookup Table)

    正在搜索:5f4dcc3b5aa765d61d8327deb882cf99:已发现:password5
    正在搜索:6cbe615c106f422d23669b610b564800:不在数据库中
    正在搜索:630bf032efe4507f2c57b280995925a9:已发现:letMEin12
    正在搜索:386f43fab5d096a7a66d67c8f213e5ec:已发现:mcd0nalds
    正在搜索:d5ec75d5fe70d428685510fae36492d9:已发现:p@ssw0rd!
    

    查找表是一种非常有效的方法,可以快速地破解许多相同类型的散列。总体思路是在密码字典中预先计算密码的散列值,并将散列值及其对应的密码存储在查找表数据结构中。良好实现的查找表可以在包含数十亿个散列的情况下每秒处理数百个散列查找。

    如果您想更好地了解查找表的速度,请尝试使用 CrackStation 的免费散列破解器破解以下 SHA256 散列。

    c11083b4b0a7743af748c85d343dfee9fbb8b2576c05f3a7f0d632b0926aadfc
    08eac03b80adc33dc7d8fbe44b7c7b05d3a2c511166bdb43fcb710b03ba919e7
    e4ba5cbd251c98e6cd1c23f126a3b81d8d8328abc95387229850952b3ef9f904
    5206b8b8a996cf5320cb12ca91c7b790fba9f030408efe83ebb83548dc3007bd
    
  • 反向查找表(Reverse Lookup Table)

    正在用户散列列表中搜索 hash(apple)...     :匹配 [alice3, 0bob0, charles8]
    正在用户散列列表中搜索 hash(blueberry)... :匹配 [usr10101, timmy, john91]
    正在用户散列列表中搜索 hash(letmein)...   :匹配 [wilson10, dragonslayerX, joe1984]
    正在用户散列列表中搜索 hash(s3cr3t)...    :匹配 [bruce19, knuth1337, john87]
    正在用户散列列表中搜索 hash(z@29hjja)...  :没有用户使用此密码
    

    这种攻击允许攻击者同时对许多散列应用字典攻击或暴力破解,无需预先计算查找表。

    首先,攻击者创建一个查找表,并将泄漏的用户账户数据库中的每个密码散列映射到具有该散列的用户列表。然后攻击者对每个密码猜测进行散列处理,并使用查找表来获取其密码与攻击者猜测相同的用户列表。这种攻击特别有效,因为多个用户拥有相同的密码是很常见的。

  • 彩虹表(Rainbow Table)

    彩虹表是一种使用时间换取空间的技术。它与查找表类似,只是牺牲了散列破解速度来使查找表更小。由于彩虹表更小,因此可以将更多散列的解存储在相同的空间中,使其更有效。可以破解任何不超过 8 个字符的密码的 md5 散列的彩虹表是存在的

接下来,我们将研究一种称为加盐的技术,它使得无法用查找表和彩虹表来破解散列。