# 怎样用校验和核对下载的文件

下载链接底下那行十六进制放在那里，是为了让你能证明文件是完好到达的。比对它大约花一分钟。至于这次比对到底值多少，以及哪一个习惯会让它一文不值，那要花掉这一页的其余部分。

[打开哈希与校验和](https://abox.tools/zh/hash-checksum/): 把下载来的文件和发布方公布的那串数字对一下，不用把它发给任何人。

最后更新 2026年8月26日

## 简短的回答

打开[哈希与校验和](https://abox.tools/zh/hash-checksum/)，把下载好的文件拖进去，再把下载页面上的校验和粘到下面那个框里。页面会从长度看出那串数字是哪种算法，然后用一句话回答。

对得上，说明你磁盘上的字节就是发布方量过的字节。对不上，就先重新下载，再谈打开。下面写的是这句话省掉的部分。

## 下载链接底下那串数字是什么

是一个哈希函数的输出：一种读遍文件每一个字节、给出一个又短又定长的答案的算法。同一个文件永远给出同一个答案，而只差一个二进制位的文件会给出完全不同的答案——不是相近的答案，是毫不相干的答案。整件事就靠这个性质撑着。

既然答案很短而文件不短，这道算术就必然丢掉信息，也就必然有很多文件共用同一个答案。有意去找出其中一个，才是难的那一半；而难到什么程度，正是下面这些算法彼此的区别。

校验和没有什么是保密的，也没有办法倒推回去。它是一枚指纹，公布出来，好让两个人能就「我们手上是同一个东西」达成一致。

## 你面前的是哪一种

你不用挑。发布方已经挑好了，你要做的是算出同一种。光看长度就能分辨：

- **32 个十六进制字符** — MD5.
- **40** — SHA-1.
- **64** — SHA-256，这也是你最常见到的一种。
- **96** — SHA-384.
- **128** — SHA-512.

没有两种长度相同，所以工具能够在没人告诉它的情况下认出你粘进来的是什么。一串 63 个字符的东西不是任何东西的校验和：那是一个在去剪贴板的路上掉了一个字符的 SHA-256。

![结果卡片：同一个文件的 MD5、SHA-1、SHA-256 和 SHA-512 摘要，每个后面都有复制按钮。](https://abox.tools/screens/verify-a-file-checksum/digests.webp)

一次全给出来，因为该用哪一个是发布文件的一方定的，不是你定的。

## 不用浏览器，在自己机器上做

每个操作系统都自带能做这件事的工具，而且就算你用网页来做，知道这条命令也值得。对于「我怎么知道你们站算得老实不老实」这个问题，没有比把同一个文件喂给你自己电脑自带的工具更好的回答了。

**Windows**，在 PowerShell 里：

```
Get-FileHash .\disk.iso -Algorithm SHA256
```

更老的机器上是 `certutil -hashfile disk.iso SHA256`，它输出大写并且带空格。比对校验和时大小写从来无关紧要：那些字母是数字，不是词。

**macOS**:

```
shasum -a 256 disk.iso
```

**Linux**:

```
sha256sum disk.iso
```

这三条对同一个文件打印出同一串字符，本站也一样。它们是有公开测试向量的严格规范，不给实现留下发表意见的余地。

## 别把眼睛看花

不要在两块屏幕上各读六十四个字符，然后判断它们看起来一样。人只会看头四个和尾四个就收手，而这恰好是攻击者会安排通过的那种比对，也是善意的疏忽混过去的方式。

把两边都粘进一个能替你比的东西里。在命令行上，`-c` 就是干这个的：

```
sha256sum -c SHA256SUMS
```

在浏览器里，就是[哈希与校验和](https://abox.tools/zh/hash-checksum/)的比对框。它按发布方写下来的样子收：光是十六进制、`sha256sum` 的一行、整份 `SHA256SUMS` 文件、`SHA256 (disk.iso) = …` 这种写法，或者从 script 标签上扒下来的 `integrity="sha384-…"`。然后用一句话回答是或不是。

![比对卡片：一串校验值被粘进输入框，下面给出与文件相符的判定。](https://abox.tools/screens/verify-a-file-checksum/compare.webp)

把下载页面上写的那串粘进来，比对交给工具。盯着屏幕数六十四个字符，正是它要省掉的那一步。

## 对上了，究竟证明了什么

证明你磁盘上的这些字节，就是某个人写下那串数字时手边的那些字节。这确实值得知道，也比多数人以为的要窄，所以值得把它管得着和管不着的分别列出来。

**对上了，可以排除：**

- 一次提前停住、却给你留下一个看着完整的文件的下载；
- 传输途中、快坏的硬盘上，或者一根劣质 USB 线造成的损坏；
- 拿错了文件：本该 x86 却拿了 ARM，或者拿的是上个月的发布；
- 一个不声不响地发着与它所宣称不同的东西的镜像站。

**对上了，排除不了：**

- **这个文件是恶意的。**发布方量恶意软件和量别的东西一样准。校验和说的是「这就是他们发出来的东西」，从来不是「这个东西安全」；
- **发布方本身被攻破了。**能把服务器上的文件换掉的人，会在同一分钟里把下面那行校验和也换掉。这就说到下一节了。

## 让整件事白做的那个错误

从和文件同一个页面、同一条连接上取校验和。

想一想你在防什么。如果担心的是下载坏了，校验和从哪儿来都行，这次核对是有效的。如果担心的是有人动过这个文件，那么能换掉文件的人也能换掉印在下面的那行十六进制，因为两者来自同一台服务器、同一条连接。你等于是在请伪造者确认签名。

校验和最值钱的时候，是它走的路和文件不同的时候：

- 一份带分离 GPG 签名的 `SHA256SUMS`，用你本来就有的密钥去验。发行版就是这么做的，这才是真正的答案；
- 从邮件列表的发布公告或者源码仓库的标签上取，而不是从下载页面上取；
- 从另一个域名下的第二个镜像取一份，再把两份彼此对照；
- 交给包管理器，它会用随操作系统一起来的密钥替你做这件事。

这些都不意味着核对同页面上的校验和就没用了。它抓得住坏掉的下载，而那正是真会落到人身上的故障。只是别对自己说它还抓住了别的什么。

## MD5 和 SHA-1 已经破了。有时候还是照用

两者都在这里要紧的那个最强意义上破了：*碰撞*可以被刻意造出来。同一个 MD5 的两个不同文件，从 2004 年起用普通硬件就能做出来；2017 年一个团队做出了同一个 SHA-1 的两份不同 PDF。到 2020 年，能自选前缀的那种攻击已经降到几万美元的租用算力。

落到实处就是：对上的 MD5 不再能告诉你没人动过这个文件，因为想动的人本来就能造出一个同值的另一个文件。它仍然能告诉你下载没有被截断、没有损坏，因为随机的意外不会正好撞上一个碰撞——那种概率是任何意外都没有过的。

所以，如果发布方只印了一个 MD5，那就核对它：这比不核对强。而如果发布的人是你，请印一个 SHA-256。

## 对不上，现在怎么办

1. **重新下一次**，还从同一个地方。断掉或者续传过的传输是遥遥领先的头号原因，第二份副本通常就把事情了结了。
2. **确认你比的是那一行。**发布页面上会列好几个文件：安装包的校验和永远不会和压缩包的对上，ARM 的也不会和 x86 的对上。
3. **确认版本。**收藏起来的校验和页面，在小版本发布的那天就过期了。
4. **换一个镜像试试**，再把两份文件的校验和彼此对照。两个镜像彼此一致却都和公布的数字不同，和一个镜像同时和另外两者不同，是两种不同的问题。
5. **在弄清楚之前不要打开它。**一个通不过校验和的文件，往好里说是损坏了，往坏里说根本不是你要的那个文件。

## 为什么要在浏览器里做

因为命令行不是大多数人待的地方；也因为那个显而易见的替代方案——一个让你把文件传上去的网站——用来对付一个你本来就在怀疑的安装包，是件很奇怪的事。为了弄清楚文件有没有在路上被动过手脚而把它发到别处，等于又多加了一个可以被动手脚的地方。

[哈希与校验和](https://abox.tools/zh/hash-checksum/)按每次四兆在你自己的机器上读这个文件，所以没有上传、没有大小上限，除了页面本身之外也没有别的需要你信任的东西；而那个页面你读得到，拔掉网线它照样工作。如果你更愿意信自己的操作系统，就跑上面那一节的命令，再把两个答案对一下。它们会一样。
