> For the complete documentation index, see [llms.txt](https://jun-wang.gitbook.io/learnjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jun-wang.gitbook.io/learnjava/ji-shu-xue-xi/suan-fa/md5-jie-shao.md).

# MD5介绍

## 1. md5简介

md5的全称是**md5信息摘要算法（英文：MD5 Message-Digest Algorithm ）**，一种被广泛使用的密码散列函数，可以产生一个128位（16字节，1字节8位）的散列值（常见的是用32位的16进制表示，比如：0caa3b23b8da53f9e4e041d95dc8fa2c），用于确保信息传输的完整一致。

## 2. md5原理

md5将整个文件当做一个大文本信息，通过不可逆的字符串变换算法，产生一个唯一的MD5信息摘要。文件的md5类似于人的指纹，在世界上是独立无二的，如果任何人对文件做了任何改动，其md5的值也就是对应的“数字指纹”都会发生变化。

对MD5算法简要的叙述可以为：MD5以512位分组来处理输入的信息，且每一分组又被划分为16个32位子分组，经过了一系列的处理后，算法的输出由四个32位分组组成，将这四个32位分组级联后将生成一个128位散列值。

md5与对称和非对称加密算法不同，这两种密码是防止信息被窃取，而摘要算法的目标是用于证明原文的完整性。

## 3. md5特性

#### 1. 不可逆

没有系统有办法知道md5原来的文字是什么。

#### 2. 具有高度的离散性

md5码具有高度的散列性，没有规律可循，哪怕原信息只有一点点的变化，比如多个空格，那么就会导致md5发生巨大变化，也可以说产生的md5码是不可预测的。

#### 3. 压缩性

任意长度的数据，算出的md5值得长度都是固定的。

#### 4. 弱碰撞性

已知原数据和其md5的值，想找到一个具有相同md5值得数据（即伪造数据）是非常困难的。

## 4. md5的用途

* **密码的加密存储**，用户设置密码时，服务端只记录这个密码的MD5，而不记录密码本身，以后验证用户身份时，只需要将用户输入的密码再次做一下MD5后，与记录的MD5作一个比较即可验证其密码的合法性。&#x20;
* **数字签名**，比如发布一个程序，为了防止别人在你的程序里插入病毒或木马，你可以在发布这个程序的同时，公开这个程序文件的MD5码，这样别人只需要在任何地方下载这个程序后做一次MD5，然后跟公开的这个MD5作一个比较就知道这个程序是否被第三方修改过。&#x20;
* **文件完整性验证**，比如当下载一个文件时，服务器返回的信息中包括这个文件的md5，在本地下载完毕时进行md5，将两个md5值进行比较，如果一致则说明文件完整没有丢包现象。&#x20;
* **文件上传**，比如百度云实现的秒传，就是对比你上传的文件md5在百度服务器是否已经存在了。

## 5. 一些疑问

#### 1. 同一个文件用不同的语言计算出来的md5一样吗？

只要算法正确，都是一样的。

#### 2. 拷贝的文件md5会改变吗？

不会。

#### 3. 还有什么其他的摘要算法么？

除了MD5，还有更安全的SHA-1，SHA-2（包括SHA-224、SHA-256、SHA-384，和SHA-512 ），SHA-3，RIPEMD-160等哈希[加密算法](http://www.atool.org/hash.php)。

### 参考：

关于王小云破解MD5之我见 ：<https://blog.csdn.net/raptor/article/details/97270>

MD5作用有哪些：<https://blog.csdn.net/jike_yangyujing/article/details/80512205>

MD5算法原理及其实现：<https://blog.csdn.net/u012611878/article/details/54000607>
