在回答这个问题之前,我们需要先弄清楚两点:
- 什么是加密算法?
- 什么是 MD5?
1.什么是加密算法?
数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码为“密文”,使其只能在输入相应的密钥之后才能显示出原容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。
-- 来自《百度百科》
使用密码学可以达到以下三个目的:
- 数据保密性:防止用户的数据被窃取或泄露;
- 数据完整性:防止用户传输的数据被篡改;
- 身份验证:确保数据来源与合法的用户。
- 加密算法分类
常见的加密算法大体可以分为两大类:对称加密和非对称加密。
- 对称加密
对称加密算法就是用一个秘钥进行加密和解密。
- 非对称加密
与对称加密算法不同的是,进行加密与解密使用的是不同的秘钥,有一个公钥-私钥对,秘钥正确才可以正常的进行加解密。
2.什么是MD5?
MD5算法:MD5全称Message Digest Algorithm 5,即消息摘要算法第5版。
MD5 以 512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
MD5算法的主要特点:
- 长度固定
MD5加密后值固定长度是128位,使用32个16进制数字进行表示。
- 单向性
如果告诉原始消息,算法是MD5,迭代次数=1的情况下,我们一样可以得到一摸一样的消息摘要,但是反过来却不行。
- 不可逆
在不知道原始消息的前提下,是无法凭借16个字节的消息摘要(Message Digest),还原出原始的消息的。
下面这个消息摘要,你知道他的原始信息是什么吗?
其实,原始信息是以下长长的字符串:
- 恒定性
如果按照以上示例的原始信息,大家与我计算出来的消息摘要不一样,那肯定你是使用了一个假的 MD5 工具,哈哈哈。
当原始消息恒定时,每次运行MD5产生的消息摘要都是恒定不变的,无论是谁来计算,结果都应该是一样的。
- 不可预测性
让我们再来尝试一次,「不可逆」中应用到的原始消息的最后一个字母'D',修改成'E',如下所示:
那经 MD5 后产生的消息摘要,是不是和 '454e2624461c206380f9f088b1e55fae' 很相似呢?
让大家失望了,产生的消息摘要没有一丝一毫的关联性,新的消息摘要如下所示:
聊到这里,突然想到一个有意思的问题:
MD5是32位的,理论上是有限的,而世界上的数据是无限的,那会不会生成重复的MD5值?
是不是也有同学产生相似的疑问呢?
理论上来讲,当然会生成重复的MD5值。
分享一个经典的例子:
- 数据源1:
- 数据源2:
它们竟然有着共同的MD5值(☞ 注意看,数据源1、2是存在很多细节不同的):
3MD5是加密算法吗?
MD5计算,对原始消息(Message)做有损的压缩计算,无论消息(输入值)的长度字节是多少,是1亿字节还是1个字节,都会生成一个固定长度(128位/16字节)的消息摘要(输出值)。
也就是说,MD5 算法和加密算法都可以将信息转换为另外一种内容,但是,MD5 算法对比 加密算法 缺少了解密过程。
好比一头山羊,被层层加工制作成一包包风干羊肉,这个就是一次MD5操作。这种加工过程,势必将羊身体N多部位有损失,故无法通过羊肉干再复原出一头山羊...
使用 加密算法 加密后的消息是完整的,并且基于解密算法后,可以恢复原始数据。而 MD5 算法 得到的消息是不完整的,并且通过摘要的数据也无法得到原始数据。
所以严格意义上来讲,MD5 称为摘要/散列算法更合适,而不是加密算法!
那现实的问题来了,MD5究竟有什么用?