什么是MD5?MD5的原理及应用

一、MD5概述

MD5:英文全称是 Message-Digest Algorithm 5。
中文名为 消息摘要算法第五版。它是消息摘要算法,属于 Hash 算法的一种。它是一种不可还原的算法。

正常情况下,它的结果是一个 长度为 32位 的 16进制 的 字符串。
也有一些地方会用到 16 位的 MD5的结果,它实际上是从 32位 字符串中取中间的第9位到第24位的部分,即长度是 16位。

二、MD5的主要特点

不可逆,相同的数据的MD5值肯定一样,不同数据的MD5值不一样(理论上可能会有相同的,概率非常低)。
一个MD5理论上的确是可能对应无数多个原文的,因为MD5是有限多个的而原文是可以有无数多个的。比如主流使用的MD5将任意长度的字符串映射为一个128bit(16 * 8)的大整数。也就是一共有 2的128次方种可能,大概是 3.14*10的38次方,这个数字是有限的,但是世界上可以被用来加密的原文则有无数的可能性。

三、MD5的性质

压缩性:任意长度的数据,算出的MD5值长度都是固定的(相当于超损压缩)。
抗修改性:对原数据进行任何改动,哪怕是只修改1个字节,所得到的MD5值都会天差地别。
容易计算:从原数据计算出MD5值很容易就可以计算出来。
弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。注意这里是非常困难,并不是一定找不到。
强抗碰撞性,想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。注意这里是非常困难,并不是一定找不到。

四、MD5破解

MD5有不可逆的特点,但是不可逆,并是代表不能破解。

某些MD5破解网站,专门用来查询MD5码,原理是它通过把常用的密码先进行MD5处理,然后将数据存储起来,然后再跟需要查询的MD5结果匹配,这时就有可能通过匹配的MD5值得到明文数据,所以有些简单的MD5码是可能反查到加密前的明文的。

五、MD5防破解

多重加密

所谓多重加密,其实 就是把要加密的原文加密成MD5密文,然后再一次将MD5密文加密成MD5密文,多试几次,一般3次以上,上线破解的网站就匹配不上了。记住:匹配不上,不一定就是足够安全哦,只是不容易被轻易破解了(因为第二次要破解的原文是一个32位的16进制的字符串,以此类推),增加了破解的时间成本而已。

加盐加密

比如在Java语言中的 Md5Crypt.apr1Crypt(“要加密的密文”, “自定义盐值”), 可以多重使用,自行定义。
也有的场景下通过在原字符串的基础上增加一个秘钥串,然后做md5,恶意用户就算拿到这个MD5也无法对应原始字符串。

六、MD5的用途

密码存储

处于安全考虑,所有的原生密码不能直接存储到数据库中,以防数据泄露导致许多问题出现,因此,会将明文密码经过MD5加密后存储到数据库中。这样即使是开发人员也无法知道用户密码。

一致性校验

下载文件的校验码,比如双方约定的字符串或者文件,发送方可提供文件的同时,也提供MD5结果,用于接收方接收后对文件重新 MD5得出结果做对比,就知道文件是否下载完整,或者传输过程中有无被篡改等。
如果是完整的文件,也可以通过Linux命令 md5sum 文件名 的方式计算出md5值。

还有网盘上传文件的时候,会先计算下文件的md5,和服务器上的进行比较,如果存在就直接不上传,直接使用已经存在的文件,即使是几个G的文件,也会出现秒传的现象。

以上对Md5的用途基本上介绍完成了。