初步了解密码加密(四) | 青训营笔记

165 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第16天

上期讲了hash破解中的穷举法和字典法, 这期讲一下hash破解中的彩虹表

彩虹表

彩虹表是一种时间换空间的方法, 与字典法类似, 不过彩虹表通过一些特定的算法, 将hash结果映射到密码空间中(这里的密码空间是10位密码中的一种可能组合), 通过建立这种Hash链, 牺牲一些查询时间, 来节省存储记录的空间消耗

假定存在某密码"asdfghjkl", 经过一次MD5加密, 得到hash结果"d78cc6c2fea32b9f", 我们通过特定的算法R, 将其映射到10位密码空间上, 假定映射结果为"qwertyuio", 将映射结果视为新的密码, 继续对其进行MD5加密, 使用特定算法H将其映射到密码空间中, 往复这个过程, 得到一条Hash结果和明文密码的链状结构.

假定这条hash链如下所示

"asdfghjkl" -->> "d78cc6c2fea32b9f" -->> "qwertyuio" -->> "2aba4cd301a02b9f" -->> "zxcvbnm"

彩虹表存储时仅存储hash链的头部和尾部.

查找时, 对给定hash结果以此使用算法R和算法H进行映射, 当匹配到Hash链的尾部时, 说明该Hash结果的未加密文本, 很可能就在这条Hash链中

以Hash结果"2aba4cd301a02b9f"为例, 我们使用R函数和H函数, 最终得到结果"zxcvbnm", 那么表明该Hash结果的原文就在这条链中

此时我们通过对该Hash链的头部重新计算, 生成这条hash链的内容, 直至某一步的Hash结果与给定hash值对应, 那么它的前一步很可能就是该hash结果的原文.

值得一提, 彩虹表通常会选用一些列算法R_1, R_2...R_k来将hash值映射到密码空间, 用以避免Hash链的碰撞.

穷举法和字典法更为简单, 但是在面对存储了大量的密码系统时会非常乏力, 彩虹表主要是应对大型的密码库, 通过增加一定的查找时间, 降低字典法的空间消耗.