和朋友聊天聊到了MD5,然后网上找了一波资料,结合自己的理解,总结下。
MD5不是加密
通常说到md5,后面都会跟上加密两个字,但是实际情况是:MD5不是加密,而是一种算法。
加密是什么?
加密最重要的是能够解密,给你一个东西,你把它加密成一堆乱码后,得有个解密方法将它还原。
如果这个解密方法是根据加密的规则反着来,然后将其还原,则称之为对称加密;如果这个解密方法是用的另外一套逻辑,但是最后还是将其还原了,则称之为非对称加密。
如果加密是从A点走到了B点,从B点原路返回到A点就是对称加密;另外找了条路回了A点,则是非对称加密。
但是无论怎样,最终还是会解密回来。
但MD5是不可逆的,MD5是hash算法的一种。hash算法大家都知道,无论多么庞杂的一堆数据,最终都会计算成一串文本数据。给定一个数据和hash算法,可以确定出hash值;但是我拿着hash算法和hash值,是推导不出原数据的。
MD5也是同理。
MD5用途-验证
那MD5有何用途呢?可以用来做验证。
有些网站下载资源(比如下载系统),下载完成后同时会给出一串MD5值,用于判别你下载的文件是否就是网站上的那个源文件。即你拿着下载完成后的文件进行MD5算法,将计算后的结果与网站给到的MD5值进行比对。如果值相等,则该文件基本就是源文件了;如果值不等,则文件肯定不是源文件。
什么叫‘基本就是’。意思是从理论上来说确实会存在两个不同的资源用MD5算出来的MD5值是相同的,但是这种情况可能性微乎其微,被你碰上的可能性就更微了,基本可以忽略。
其原理就和hash算法的原理是一样的,MD5本质就是一套很优秀的hash算法,优秀的地方在于碰撞率很低,即刚刚提到的不同文件存在相同的MD5值的概率很低。
但可以确定的是,如果你将下载的资源进行MD5处理的结果,和官网给出的源文件MD5值不相同,那么你下载的资源铁定是出错了。
MD5用途-存密码
以前很多网站都有找回密码的功能,现在基本上都找不回了,密码忘了只有一个法子:修改密码。
我来试着解释下:
上古时期,密码明文存储,大家都觉得不安全,所以都用自己的方式进行加密。
加密我之前说了,意思是可以解密。比如当你的数据库数据遭泄露的时候,加密后的密码就泄露了,既然可以被解密,那么这些数据就有被转换成原数据的可能(比如内部员工拿到了解密密钥),这就叫不安全。
MD5从本质上解决了这个问题,因为它没有加密,而是直接把数据给hash了,且不可逆,这就完全没有被转换成原数据的可能了。
既然如此,服务器如何识别你输入的密码是你的密码呢?把你输入的密码也MD5计算一遍,拿着去和数据库中的md5对比,若一样,则登陆成功。
所以当你密码忘记了以后,就再也找不回来了,因为MD5是不可逆的。
彩虹表
这时就有人可能会要杠了。
“你看,我有个MD5值,我就能逆向的推导出原文本!”
这是因为md5碰撞率极低,所以就文本而言,基本上都是一个文本对应了一个MD5值,这个时候只需要把一些简单的文本与其对应的md5值存起来放到一张表里面,基本上就都是一一对应的关系了,然后你给出个md5值,我直接从表里面取原数据返回不就可以啦。
这张表就叫彩虹表。
认真来说这根本就不叫解密,这叫...我也不知道叫啥。
但是这确实能获取到一些简单文本的数据,所以当你某网站设了一个简单的密码,而且该网站用的是MD5算法存的密码,若该网站密码MD5值泄露,你的密码就有可能被通过用彩虹表的方式找到。
不过彩虹表的数据量终归是有限的,就算无限其查找所耗时终归也是无法计算的,所以当你的密码更复杂一些,彩虹表就不太可能穷举出所有的数据了。
加盐
有更专业点的解决方案么?有的,加盐。
所谓加盐,就是在拿到用户密码的时候,对密码进行一些改变,然后再MD5计算。登录的时候拿到的密码同样经过一道相同的改变,再计算MD5值加密后并对比,这样一样可以实现验证密码的功能。
这个时候就算黑客通过彩虹表“破解”了你的密码,他拿到的也只是一串被改变了的密码,而不是真实密码,这样你的密码就完全不可能被‘破解’了。
这种方法被形象的称之为“加盐”。
最后还有啥误区或者理解上有问题的地方么,欢迎大家留言讨论。