针对口令的暴力破解攻击方式

用户名加口令(也就是常说的密码)仍然是目前最常用的身份验证方式。在身份识别一文中,我们介绍了几种常用的针对口令验证的攻击和防范技术。今天这篇着重讲一下其中的暴力破解。

暴力破解

暴力破解的基本思想很朴素:通过不断重试来猜测口令。不过现在的系统都有防止自动化登录的机制,如验证码、多次输入错误口令后用户受限等;同时系统基本都是采用存储和对比口令摘要的方式进行验证。而前面讲过,摘要运算是单向加密,也就是无法从摘要计算出原文。因此不断重试并不是指采用尝试不同的口令直接登录系统的方式,而是通过尝试计算不同原文的摘要,试图找到与目标用户的口令摘要一致的摘要,从而确定口令原文的破解方式。多说一句,目标用户的口令摘要比较容易拿到:通过网络抓包或从数据库拖库得到。

对于上面的问题,最简单的方法就是对不同的原文进行穷举计算了。但实际上是不可行的,比如,对于10位的大小写字母加数字(先不算特殊字符了)组成的口令,其数量是(26*2+10)^10 = 62^10 = 8 .39 * 10^17,这个就约等于84亿亿,按照现在PC主频计算,即使我们每纳秒可以校验一个摘要,也就是一秒钟10亿次,全部穷举也需要26年, 这还是中等强度的口令,如果是14位长度的口令,穷举就需要近4亿年。

那我们换一种思路,利用云计算、分布计算等方法,将上述给定长度口令的所有摘要事先计算出来,然后保存到一个巨大的数据库存储中,在需要破解时直接查询摘要所对应的口令原文。我们先计算这样的数据库存储都多大。就以摘要比较短的MD5为例,每个摘要是16个字节(128位), 10位口令产生的存储数据量是(10+16)*8.39*10^17字节,约2.03万亿GB ,也就是说如果用PC里常见的1TB的硬盘,也得需要20亿块,按照目前机械硬盘中最便宜的容量价格比0.15元/GB,也需要3050亿元。另外,这还只是10位口令长度,128位摘要长度的情况……

彩虹表

由此可见,穷举计算或存储所有的摘要都是不实际的。在计算机科学里,这实际上就是经典的时间和空间选择问题。我们在开发设计程序时,有时就会遇到这样的问题:设计数据表时多存储一些冗余数据,程序查询执行时就会方便快捷很多;反之如果数据表中冗余数据较少,甚至没有,那程序查询时就要多做很多工作,查询执行的速度就会变慢。上述第一种情况就是用空间换时间,第二种情况就是用时间换空间。

回到破解口令的难题,那些可能把破解所有口令作为毕生目标的黑客们经过不断努力后发现,单纯利用时间换空间(直接穷举计算)或者空间换时间(存储所有的摘要)都是走不通的。那如果把两者结合起来呢,也就是说既消耗一部分时间也消耗一部分空间,达到两者的某种平衡,是不是就会让破解的难度大大降低呢?在此背景下,彩虹表这一暴力破解口令的利器就诞生了。彩虹表利用哈希链表的形式,保存了明文与哈希值的运算关系,但它只保存运算关系中的部分数据(相比较全部存储,空间消耗大大减少),破解者在使用彩虹表时,需要根据保存的数据自行计算还原整个运算关系(相比较穷举计算,时间消耗大大减少),以期找出中间需要的明文。

至于彩虹表的具体原理和使用方法还是比较复杂的,这里就不再展开。总之,理论和实践已经证明,彩虹表的应用确实可以大大加快口令破解的速度。而且,配合专门的硬件,比如用于比特币挖矿的一些设备与技术,可以让破解的速度提高到一个令人吃惊的程度。

目前,网上有很多彩虹表资源可以下载,有些比较好的还要收费。虽然已经大大减低了数据容量,一张彩虹表文件大小基本也在100GB以上。

不过,通过对摘要运算加盐,使相同的口令明文产生不同的摘要,可以有效抵御彩虹表的攻击,因为彩虹表的制作者在做彩虹表时并不知道你会用哪一种加盐规则。如果要使彩虹表依然有效,攻击者需要根据了解你的加盐规则,并根据规则修改或重新生成彩虹表。

字典攻击

上面说到的暴力破解和彩虹表都是根据口令长度和规则尝试所有可能数据进行破解。而字典攻击是指根据预先设定的“字典”生成口令进行尝试破解。而所谓字典,就是攻击者认为有可能出现在口令中的文本或数据的集合。比如常见的弱密码----"111111","123456","password";包含用户信息的数据,如电话号码,生日,身份证,用户名;从其他系统泄露的口令集合等等。进行字典攻击时,从字典中取出数据并运用一定的变形规则,生成口令进行尝试。由此可见,字典攻击中的“字典”是关键,它的质量高低决定了破解的难易程度。实际上,字典攻击已经运用了社会工程学的办法,它利用用户设置口令的习惯,比如我们都喜欢用简单的口令,喜欢用自己记得住的口令,喜欢用相同或相似的口令,来进行破解攻击。大家有兴趣的话,可以下载几个常用的字典攻击工具,测试一下自己平常使用的登录口令是否强壮,看看工具花多长时间能把它给算出来。

结论

总结一下,防范常见暴力破解,使用口令验证方式时应注意以下几点:

系统必须使用口令摘要验证和存储,禁止明文验证;口令长度不应少于8位;口令应是数字、字母大小写及特殊字符的组合;系统应禁止使用弱口令;系统应采用验证码、多次登录失败禁用账户等方式防止自动化攻击;如果需要,系统可以采用摘要加盐的方式,抵御彩虹表攻击和重放攻击。

(0)

相关推荐