(一)摘要的用途
.
比如一些提供下载的网站,在页面上除了压缩包的下载地址还提供了对应的MD5值。 我们下载该压缩包后可以查看压缩包的MD5值。 对比下载的压缩包MD5值和网站提供的MD5值,如果两个MD5值不一致,那么说明该压缩包不是官方提供的那个压缩包,可能被替换成其他文件或被修改过。比如苹果开发工具的XCodeGhost事件。
MD5算法就是一种常见的摘要算法。该算法可以生成压缩包的一个128 bit 的二进制串。除了压缩包,也可以应用于其他文件和字符串。比如数据库中不会直接存储账号密码,比如我就习惯将 密码拼接一个无规律的字符串 然后计算出MD5摘要放入数据库中(下面会讲解原因)。MD5经常和BASE64结合使用。
(二)摘要和加密是两个概念
1,摘要
摘要是哈希值,我们通过散列算法比如MD5算法就可以得到这个哈希值。
摘要只是用于验证数据完整性和唯一性的哈希值,不管原始数据是什么样的,得到的哈希值都是固定长度的。
不管原始数据是什么样的,得到的哈希值都是固定长度的,也就是说摘要并不是原始数据加密后的密文,只是一个验证身份的令牌。所以我们无法通过摘要解密得到原始数据。
2,加密
加密是通过 “加密算法” 将 "明文" 加密成 “密文”。 我们可以通过 “密钥” 和 “解密算法” 将 “密文” 还原成 “明文”。
3,摘要的理解误区
错误的理解:
通过加密算法得到信息摘要。
可以通过对信息摘要这个加密结果进行解密得到原始数据。
错误纠正:
得到摘要的算法是散列算法,没有所谓的 “加密” 、“解密” 的说法,这些说法其实都是不严谨的,虽然在很多书上都说这么描述的。
摘要只是验证身份的令牌,我们无法通过摘要还原出原始数据。
(三)MD5算法不是加密算法
1,MD5算法简介
MD5是用于计算摘要的散列算法,计算结果是 固定长度为 128bit 的二进制串。不是加密算法。
2,MD5算法不是常用于账户密码的加密吗?
这样理解是不严谨的,因为我们也是用MD5计算出账户密码的摘要,通过这个摘要是无法还原出账户的原始密码的。因为摘要只是个验证身份的令牌,不能通过令牌还原出原始数据。
3,MD5算法不可逆,那么网上的那些MD5在线加解密怎么看?
MD5算法是不可逆的,我们无法从算法入手还原出MD5算法处理前的结果。由于MD5是信息-摘要算法,通过摘要是无法得到原始数据的,所以解密这一说法本身就是错误的。
4,栗子讲解
虽然MD5算法不可逆,也无法通过摘要还原出原始数据,但这不代表安全性就是无懈可击的。
由于字符串通过MD5计算的摘要是唯一的,那么MD5字典随着时间积累保存越来越多的MD5记录,通过穷举这个字典就可以很简单地找到你的密码。
比如下面这个网站就保存了很多MD5记录,也就是这个网站有一个MD5字典,我们输入通过MD5算法的123的摘要。通过穷举这个字典,马上就找到这个摘要对应的信息是123。
以上不是通过破解MD5算法,也不是还原信息摘要的方式得到原始信息。而是通过穷举MD5字典,字典里面保存着类似 (摘要) 202CB962AC59075B964B07152D234B70:(信息)123这样的记录,我们才知道该摘要对应的信息是123。
5,防止MD5字典穷举 :提高信息的长度来提高字典穷举的复杂度
1)分析
穷举字典法要求字典保存MD5算法的信息和计算后的摘要,字典是有限的,那么多信息不可能都存下来,所以一般只会保存长度比较短的信息和对应的信息摘要。一般情况下密码长度不会很长,所以通过穷举字典基本上都可以找到密码摘要对应的信息。
退一步说,即使MD5字典保存了很长的信息和对应的信息摘要,那么说明这个字典是保存的记录是非常非常多的,即使穷举的话也要花非常漫长的时间才能穷举到该记录。
所以我们可以通过提高信息的长度,这样MD5字典存在该信息的 信息-摘要 记录的可能性很低,即使存在也要耗费非常多的时间去穷举。
2)实现思路
以前写Rails应用的时候,先将信息进行BASE64编码,这样得到的就是一个很长的字符串。
现在写SSM应用的时候,我没有采取先用BASE64进行编码的方案,而是 "密码 + 任意字符串"再进行MD5加密。比如 密码是password,那么我会下面这么做:
作者:suhuanzhen
领取专属 10元无门槛券
私享最新 技术干货