学习编程 2018-02-09
比如一些提供下载的网站,在页面上除了压缩包的下载地址还提供了对应的MD5值。我们下载该压缩包后可以查看压缩包的MD5值。对比下载的压缩包MD5值和网站提供的MD5值,如果两个MD5值不一致,那么说明该压缩包不是官方提供的那个压缩包,可能被替换成其他文件或被修改过。比如苹果开发工具的XCodeGhost事件。
MD5算法就是一种常见的摘要算法。该算法可以生成压缩包的一个128 bit 的二进制串。除了压缩包,也可以应用于其他文件和字符串。比如数据库中不会直接存储账号密码,比如我就习惯将 密码拼接一个无规律的字符串 然后计算出MD5摘要放入数据库中(下面会讲解原因)。MD5经常和BASE64结合使用。
加密是通过 “加密算法” 将 "明文" 加密成 “密文”。我们可以通过 “密钥” 和 “解密算法” 将 “密文” 还原成 “明文”。
错误的理解:
错误纠正:
MD5是用于计算摘要的散列算法,计算结果是 固定长度为 128bit 的二进制串。不是加密算法。
这样理解是不严谨的,因为我们也是用MD5计算出账户密码的摘要,通过这个摘要是无法还原出账户的原始密码的。因为摘要只是个验证身份的令牌,不能通过令牌还原出原始数据。
MD5算法是不可逆的,我们无法从算法入手还原出MD5算法处理前的结果。由于MD5是信息-摘要算法,通过摘要是无法得到原始数据的,所以解密这一说法本身就是错误的。
虽然MD5算法不可逆,也无法通过摘要还原出原始数据,但这不代表安全性就是无懈可击的。
由于字符串通过MD5计算的摘要是唯一的,那么MD5字典随着时间积累保存越来越多的MD5记录,通过穷举这个字典就可以很简单地找到你的密码。
比如下面这个网站就保存了很多MD5记录,也就是这个网站有一个MD5字典,我们输入通过MD5算法的123的摘要。通过穷举这个字典,马上就找到这个摘要对应的信息是123。
以上不是通过破解MD5算法,也不是还原信息摘要的方式得到原始信息。而是通过穷举MD5字典,字典里面保存着类似 (摘要) 202CB962AC59075B964B07152D234B70:(信息)123
这样的记录,我们才知道该摘要对应的信息是123。
穷举字典法要求字典保存MD5算法的信息和计算后的摘要,字典是有限的,那么多信息不可能都存下来,所以一般只会保存长度比较短的信息和对应的信息摘要。一般情况下密码长度不会很长,所以通过穷举字典基本上都可以找到密码摘要对应的信息。
退一步说,即使MD5字典保存了很长的信息和对应的信息摘要,那么说明这个字典是保存的记录是非常非常多的,即使穷举的话也要花非常漫长的时间才能穷举到该记录。
所以我们可以通过提高信息的长度,这样MD5字典存在该信息的 信息-摘要 记录的可能性很低,即使存在也要耗费非常多的时间去穷举。
以前写Rails应用的时候,先将信息进行BASE64编码,这样得到的就是一个很长的字符串。
现在写SSM应用的时候,我没有采取先用BASE64进行编码的方案,而是 "密码 + 任意字符串"再进行MD5加密。比如 密码是password,那么我会下面这么做:
1,result = MD5加密算法(password + "adfasdfsdafsadasou89ZXcj@#$aKJdjklj;easd../dSF.,";) 2,将result存入数据库