MD5作为一种Hash算法,因其运算具有不可逆性,常常用于保存密码以及生成数字签名。参考博客1和2对该算法的实现原理进行了详细介绍,在此就不再赘述,只做如下总结:本质上,MD5就是将明文对应的二进制值与四个特定的32位的二进制值进行多轮的与、或、非、异或等运算,将明文对应的二进制转换成新的二进制。
关于为什么MD5是不可逆的,参考博客1中说是由于MD5的运算过程中有很多入参,但实际上,MD5运算过程中的四个入参都是确定的(详见参考博客2中的A、B、C、D)。其实由参考博客2的运算过程可知,当运算过程中出现进位时,进位被直接丢失而不会保存。也就是说,MD5的运算过程存在信息丢失。由于不知道运算过程中会有多少个进位在哪一步被丢弃,因而仅仅根据MD5的计算过程和得到的最终结果,是无法逆向计算出明文的。这才是MD5不可逆的真正原因。
此外,本文还想补充一点就是:MD5常常和Base64编码一起使用。原因是:由前面的总结可知,MD5的输入是明文对应的二进制,输出也是二进制,但由于输出的二进制足够散列,因而无法保证输出的二进制还能解析成可打印字符(以ASCII码为例,其第0~32号及第127号是控制字符或通讯专用字符,不便于打印/显示/存储),而Base64恰好是一种网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
参考博客:
1、https://www.jianshu.com/p/82729c87ef68 MD5的实现原理
2、https://blog.csdn.net/xuejianbest/article/details/80391237 hash算法原理之md5过程
3、https://blog.csdn.net/qq_20545367/article/details/79538530 什么是Base64