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

119 阅读2分钟

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

上期讲完了Hash加密, 这期讲一下常用的Hash破解方法

Hash破解

最开始需要明确一点, 本文所讲的Hash破解, 并不是常规意义上Encode(x)=y, Decode(y)=x的这种破解, 这设计到hash机密的设计原理, 以MD5为例, 将变长的文本信息映射到128位hash数值上, 即从无限映射到有限. 显而易见, 我们无法从有限的信息得到无限的信息, 因此本文讲的Hash破解仅限于特定长度的hash破解.

常见的Hash破解方法有穷举法, 字典法和彩虹表法等

为了计算方便, 若无特殊说明, 本文假定密码长度均为10位

穷举法

显而易见, 穷举法就是枚举所有字符, 并对其进行hash加密, 再与需要解密的hash值进行比对

穷举法是一种简单, 但不是很可行的破解方法

当假定密码位4位阿拉伯数字时, 只需枚举1e4个组合, 就可以找到正确密码

但是当密码包含大小写字母或特殊字符时, 枚举难度显而易见的上升

假设当前密码为10位, 包含大小写字母, 则需要枚举62^{10}个组合, 即约8.4e17个组合, 目前C++一秒能执行大概2e9次运算, 为了计算方便, 我们假定1秒可以验证1e9个组合, 则破解10位密码大致需要26年, 由此可见穷举法几乎不太可行

这里我们没有考虑Hash算法的时间消耗, 实际上使用的时间只会更长

字典法

穷举法是枚举所有组合, 并对其进行Hash加密, 在验证是否一致

而字典法是预存储好一些组合和它的映射, 例如某些常用的密码等. 使用时先去字典中进行查询.

假定每位密码占用1个Byte, 而MD5的输出结果占用了128位, 即16个Byte, 不考虑其他因素, 一条记录约占26 Byte, 为了计算方便, 我们假设一条记录仅占用10 Byte, 由上知, 10位密码需要存储62^{10}个组合, 因此大概需要存储8.4e18Byte, 即约8.4e6TB的数据.

对于一个效率较高的查询表结构, 一秒钟大概可以进行数百次查询.

但是字典法的主要作用是预先存储一些常用的密码, 以便在破解时可以得到较高的效率, 只是字典法消耗的空间有些昂贵