目录
1 密码加密原则(续)
1.1 使用加盐的方式可以使得“密码”
1.2 优缺点
1 密码加密原则(续)
1.1 使用加盐的方式可以使得“密码”
如果用户的密码过于简单,使用加盐的方式可以使得“密码”(其实是盐值和真正的原始密码的组合)变得更复杂,从而降低被收录对应关系的风险!这种做法的根本思想在于“大多计算机的硬盘不足于收录特别大量的数据”。
如果允许使用95种可打印字符作为密码的组成,则8位长度的密码排列组合有 6,634,204,312,890,625 种,想要收录所有可能的8位长度密码与MD5摘要结果的对应关系,大约至少需要 6,634,204,312,890,625 x (8 + 32) 个字符,如果按照每字符占2字节来算,共需要 6,634,204,312,890,625 x (8 + 32) x 2个字节,大约需要消耗 482,701 TB的存储空间!
如果想要通过查询的方式来破解MD5编码的结果,8位长度的全部对应关系需要约50万TB的存储空间,几乎是不现实的!对于尝试破解密码的一方来说,可以采取“预计算的哈希链”来解决此问题!
在使用“预计算的哈希链”做法之前,首先,必须假定原始密码的长度,以6位长度为例,假设原始密码是`123456`,经过MD5编码后,结果是:
e10adc3949ba59abbe56e057f20f883e
接下来,需要设计一个“约简函数”,将以上摘要结果变成6位长度的,此“约简函数”应该如何设计,并没有固定的做法,假设是取出摘要结果中的前6位,则以上摘要结果经过“约简函数”的运算后,就变成了:
e10adc
接下来,再使用MD5对以上约简结果进行编码,得到:
```
96bf38d01b84aa16cf2bb9f55c61ac85
```
然后,重复以上的操作,继续使用约简函数,得到:
```
96bf38
```
继续使用MD5对以上结果进行编码,得到:
```
c6349b59d5ca7f5fa05de13d26fcf20c
```
假设,整个过程持续做10次,数据的变化将是:
```
123456
e10adc3949ba59abbe56e057f20f883e
96bf38d01b84aa16cf2bb9f55c61ac85
c6349b59d5ca7f5fa05de13d26fcf20c
ac4c4cd7cde8d12f799c72b337af37bb
068696500ff51c01bc5012884eecd673
e3225ab333b37defddba2a8022c0c468
771fd067be8d0fe2195e5df0bc9826cc
707d8265701e8573695b67cb4d667083
7750d6017d681c782c0e6bcce65fa2c0
698ff2cd213ebb4a68c49570d3b3b148
698ff2
```
对最后的结果再次使用约简函数运算,将得到`698ff2`,然后,将最开始的`123456`(原文)和最后得到的`698ff2`(密文)存储到数据库中即可!(最后一步也可以不存约简结果,而是直接存摘要结果)
假设已经某个MD5摘要数据是`e3225ab333b37defddba2a8022c0c468`,当尝试“破解”时,依然使用约简函数得到`e3225a`(与之前的做法保持一致,取出前6位),并与当前数据库的所有“密文”进行对比,如果无此结果,则对`e3225a`使用MD5进行运算,将得到的结果:`771fd067be8d0fe2195e5df0bc9826cc`再次约简,得到`771fd0`,与数据库中的再次对比,如果仍无此结果,则继续重复类似的操作,最多执行10次(与此前的生成过程保持一致),如果其中某1次命中,则密码的原文一定在对应生成过程中,则可以根据数据库中对应的原文`123456`来执行类似的操作,每次使用MD5编码后,都与尝试破解的`e3225ab333b37defddba2a8022c0c468`进行对比,最后,就可以“破解”成功!
1.2 优缺点
使用“预计算的哈希链”是典型的“牺牲时间,换取空间”的做法!
其实,以上做法仍有一部分缺陷:
- 生成对应关系需要消耗大量的时间
- 不同的链中可能存在相同的部分(取决于约简函数的设计)
为了进一步优先这个做法,就有人专门去设计了更优质的约简函数,并且,生成好了以上预计算哈希链的数据库,放在网络上提供下载!具体表现为“彩虹表”。
作为密码的加密方,为了进一步防止密码被破解,可以使用位数更长、组成字符更复杂的,甚至使用随机的盐值!
注意:即使是这样,也无法有效的阻止暴力破解!
个人主页:居然天上楼
感谢你这么可爱帅气还这么热爱学习~~
人生海海,山山而川
你的点赞👍 收藏⭐ 留言📝 加关注✅
是对我最大的支持与鞭策