MD5 到底算不算一种加密算法?
hello,大家好,我是张张,「架构精进之路」公号作者。
一旦提到加密算法,经常有人会有这样的疑问:MD5 到底算不算一种加密算法呢?
在回答这个问题之前,我们需要先弄清楚两点:
什么是加密算法?
什么是 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 是存在很多细节不同的):
3、MD5 是加密算法吗?
MD5 计算,对原始消息(Message)做有损的压缩计算,无论消息(输入值)的长度字节是多少,是 1 亿字节还是 1 个字节,都会生成一个固定长度(128 位/16 字节)的消息摘要(输出值)。
也就是说,MD5 算法和加密算法都可以将信息转换为另外一种内容,但是,MD5 算法对比 加密算法 缺少了解密过程。
好比一头山羊,被层层加工制作成一包包风干羊肉,这个就是一次 MD5 操作。这种加工过程,势必将羊身体 N 多部位有损失,故无法通过羊肉干再复原出一头山羊...
使用 加密算法 加密后的消息是完整的,并且基于解密算法后,可以恢复原始数据。而 MD5 算法 得到的消息是不完整的,并且通过摘要的数据也无法得到原始数据。
所以严格意义上来讲,MD5 称为摘要/散列算法更合适,而不是加密算法!
那现实的问题来了,MD5 究竟有什么用?
欢迎各位留言补充~
希望今天的讲解对大家有所帮助,谢谢!
Thanks for reading!
作者:张张,十年研发风雨路,大厂架构师,「架构精进之路」专注架构技术沉淀学习及分享,职业与认知升级,坚持分享接地气儿的干货文章,期待与你一起成长。
关注并私信我回复“01”,送你一份程序员成长进阶大礼包,欢迎勾搭。
版权声明: 本文为 InfoQ 作者【架构精进之路】的原创文章。
原文链接:【http://xie.infoq.cn/article/12ea09b16fe2d00011b21e152】。文章转载请联系作者。
评论