MD5是由Ron Rivest在1991设计的一种信息摘要(message-digest )算法,当给定任意长度的信息,MD5会产生一个 固定的128位“指纹”或者叫信息摘要。从理论的角度,所有的信息产生的MD5值都不同,也无法通过给定的MD5值产 生任何信息,即不可逆。
- 编程语言:C++
- 开发平台:Linux CentOS 7.0
- 开发工具:vim 代码编辑器,gcc 编译器,makefile 工程管理工具,gdb 调试器
我在刚知道 MD5 是在学习 TCP/UDP 的时候,当时他们的报头里有一个校验和的信息。经过我的查询他们采用的是 CRC 校验和,CRC 校验和才用的是补码相加的方式来验证,那么它就存在一个问题,就是当相加到溢出的时候,CRC 校验和不会停止,而是会继续相加,这就有可能导致两个字符串明明不相同,他们的 CRC 可能一样。
然后经过我的查询,得知了有 MD5 的方式来计算校验和,MD5 输入任意长度的信息,经过处理,会得到一个 128 位的信息。这个过程是不可逆的。就算两个字符串仅仅相差一个字符,他们得到的 MD5 的差别还是非常大的。
应用场景:
- 电子邮件、文件下载.... 验证一致性。
- 防止密码明文。
MD5 的计算主要是填充最后一块数据。
当程序读取到最后一块数据时(长度小于 64 字节的数据):
- 如果 len = 64 - read_len < 56 个字节
- 先给接下来的一个字节填充 0x80 就是第一位为1,其余都为0。
- 然后一直补 0 直到剩余的字节为 8 个字节。
- 将整个字符串的长度(包括之前计算过的)放到后 8 个字节里。
- 计算
- 如果 len = 64 - read_len >= 56
- 先给接下来的一个字节填充 0x80 就是第一位为1,其余都为0。
- 然后一直补 0 到末尾。
- 再生成一个字符串初始化全部为0 。
- 在这个字符串的后 8 个字节填整个字符串的长度。
- 计算
所有的步骤都是发明者规定好的,跟着文档看就行。