1. 基础信息:
- MD5算法,全称MD5信息摘要算法(MD5 Message-Digest Algorithm),是一种广泛使用的密码散列函数,可以产生128位 / 16字节的散列值(hash value),用于确保信息传输完成一致。
- 将不定长的数据变为固定长度的数据,这是散列算法的基础原理。
- MD5算法可破解,且无法防止碰撞(collision)。高度安全性的数据或是安全性认证,不适用MD5。
2. 算法基础实现:
- 算法输入输出:
- 输入:任意长度数据;
- 输出:固定长度128 bits的数据。
- 内部逻辑:
- 填充:
- 将输入信息长度填充到N,此时N mod 512 = 448;
- 当原输入信息长度本就满足N mod 512 = 448时,需填充512位;
- 填充方法为先一个1,后续全0。
- 记录信息长度:
- 剩余64位用于记录填充前输入信息的长度。
- 初始化4个32位整数A、B、C、D
- A = 0x67452301, B = 0xefcdab89, C = 0x98badcfe, D = 0x10325476;
- 循环运算:
- 将ABCD和512位的数据经过运算,输出128位结果,根据数据位高低赋值于A、B、C、D中,继续循环直至结束。
- PS:MD5具体的计算流程源码可见
sun.security.provider.MD5
。
- 输出由32位的A、B、C、D拼接而成的128位的结果
- 填充:
3. 用途:
- 防止被篡改:
- 比如发送一个电子文档,发送前先得出一个MD5值,在对方接收到文件后,核对MD5值,能避免文档被篡改;
- 文件、程序下载同样,若下载到的程序被修改过,相应的MD5值就会发生变化。
- 用于加密明文:
- 例如数据库中存储用户信息如密码时,可以直接存储经过MD5加密的密码,用户校验可以直接在后台进行。这样做既保证了存储安全,又降低了数据丢失的损害。
- 数字签名:
- 这种做法类似于防止电子文档篡改,第三方机构能通过MD5对A签署的一份文件进行摘要,后续在证明一份电子文件是否是原文件时能进行直接比对。
4. 安全性:
- MD5本身是不可逆的,所以严格上来说不算一种加解密方式。通常认为MD5的安全性很高,暴力破解的时间很长,但实际上单纯的使用MD5是很容易被破解。因为市面上存在大量的彩虹表,也就是相当于提前准备好了一套字符串-Hash值对应表,对于一些常规的字符段,很容易就能查到对应的MD5值。
- 这也是市面上很多MD5破解网站的思路。
5. Java中使用MD5:
-
Java自身提供了一套完整的密码学架构JCA,通过JCA能直接使用到MD5或是SHA等信息摘要算法。