# 哈希与校验和 — MD5、SHA-1、SHA-256、SHA-512

把下载来的文件和发布方公布的那串数字对一下，不用把它发给任何人。

> 计算任意文件的 MD5、SHA-1、SHA-256、SHA-384 或 SHA-512，并和下载页面上公布的校验和对照。文件在浏览器里读取，多大都不会上传。

这是一个浏览器交互工具，地址是 https://abox.tools/zh/hash-checksum/。文件在运行该浏览器的设备上处理。主动分享和可选联网功能都在页面上说明。下文是它的文字说明；使用工具请打开该地址。

## 你的文件**在浏览器里处理**，无须上传处理。

校验和是对文件字节做的一道算术题，而这道题就在这个页面里、用你自己这台设备的处理器算。文件按每次四兆从磁盘读进来，每一块算过就丢掉，所以任何地方都不会攒出一份完整的副本，内存里不会，服务器上更不会。这个页面的另一头根本没有服务器可以接收文件，就算这里有什么东西想发也发不出去。

- ✗ 不上传
- ✗ 没有大小上限
- ✓ 断网也能用
- ✓ 开源
- ✓ 文件不离开你的设备

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

1. **选好文件。** 拖到方框上，或者自己点开选。它会分块直接从你的磁盘读进来；这期间没有任何东西流向别处，也不存在超过多大页面就放弃的界线。
2. **让它读完。** 默认算 MD5 和 SHA-256，一遍读完一起出。进度条会显示读到哪儿了、有多快。一个大的磁盘镜像所花的时间，大致就是复制它要花的时间，因为读的量是一样的。
3. **把本该是的值粘进来。** 下载页面给你什么就粘什么，什么形式都行：光是十六进制、`sha256sum` 的一行输出、整份 `SHA256SUMS` 文件，或者从 script 标签上扒下来的 `integrity` 属性。是哪种算法由长度决定，对应的那个勾会自己打上。
4. **看那句话，别只看颜色。** 页面会用一句话告诉你，这是不是那串校验和所描述的文件。对得上，说明字节和发布方量过的一模一样；对不上，说明不是，那就先重新下载，再谈打开。
5. **需要的话把校验和带走。** 复制一个、全部复制，或者存成一个小文本文件。存的是命令行工具那种把算法名写在前面的格式，这样算法名会跟着数字一起走。

## 说得更细的版本

[怎样用校验和核对下载的文件](https://abox.tools/zh/guides/verify-a-file-checksum/): 在 Windows、macOS、Linux 或浏览器里比对 MD5 与 SHA-256 校验和的办法，对上了究竟证明了什么，以及那个让整件事白做的错误。

## 工具箱里还有

- [密码与密码短语生成器](https://abox.tools/zh/password-generator/): 在这里生成，由你自己的浏览器生成，不发往任何地方。什么都不保存，也没有历史记录。
- [JSON 格式化](https://abox.tools/zh/json-formatter/): JSON、XML、HTML、CSS 和 YAML，格式化或转换。没有一个字被贴进别人的服务器。
- [YAML 转 JSON](https://abox.tools/zh/yaml-to-json/): 两个方向都有，而且会告诉你各自的代价。这些都不会粘进别人的服务器。
- [XML 格式化](https://abox.tools/zh/xml-formatter/): 排开了好读的 XML，压平了好发的 XML，还有两个方向的 JSON 转换。这些都不会粘进别人的服务器。

## 常见问题

### 我的文件会被上传到什么地方吗？

不会。是你自己的浏览器从你的磁盘上读，你自己的处理器按每次四兆去算。这个工具没有服务端，页面的 `Content-Security-Policy` 列出了它可以连的每一个地址，没有一个是我们的。断开网络，它照样能用。

### 有大小上限吗？

没有。文件从不整个待在什么地方：分块读，每一块算过就丢掉，所以四十吉字节的磁盘镜像和一个文本文件用的是同样的几兆内存。要花的是时间，而花多少，页面会一边跑一边告诉你。 \
\
这也正是这些算法写在这里、而不是交给浏览器的 `crypto.subtle.digest` 的原因，尽管后者更快。那个调用要把整段消息放进一个缓冲区，没有办法把文件分块喂给它。用了它，能校验的最大文件就要看这个标签页碰巧分到多少内存。在手机上那是几百兆，而人们最想校验的恰恰是磁盘镜像。

### 校验和对上了，这到底证明了什么？

证明你磁盘上的这些字节，就是某个人写下那串数字时手边的那些字节。仅此而已，而这条界线值得说清楚。 \
\
它证明了下载没有被截断、没有被坏盘弄脏、没有在路上被掉包。它**没有**证明这个文件无害，因为发布方量恶意软件也一样准。而如果这串校验和是和文件从同一个页面、同一条连接过来的，那它证明的东西就很少了：能改掉其中一个的人，也能改掉另一个。校验和最值钱的时候，是它走的路和文件不同的时候：一份带签名的 `SHA256SUMS`、发行版的发布公告、第二个镜像，或者一个本来就知道这个值的包管理器。

### 对不上，那现在怎么办？

先从同一个地方重新下一次。断掉或者续传过的传输是遥遥领先的头号原因，第二份副本通常就把事情了结了。 \
\
如果第二份给出同样错误的结果，检查你比的是不是那一行：发布页面上会列好几个文件，ARM 构建的校验和永远不会和 x86 的对上。然后检查版本号。这些都没问题却还是对不上，那就别打开这个文件。换一个镜像取一份，把两份的校验和彼此对一下。

### 我该用哪一种？

用发布方公布的那一种。这件事的意义就在于和他们的数字对照，而他们那一份你替不了。 \
\
如果你是在产生校验和而不是核对校验和，用 SHA-256。MD5 和 SHA-1 在要紧的那个意义上已经破了：可以刻意造出两个不同却同值的文件，MD5 只要几小时， SHA-1 也只要不算高的花费。这不等于它们对付意外也没用了，毕竟一次截断的下载不会碰巧和原文同值；但它们确实不能再告诉你没人动过手脚。SHA-384 和 SHA-512 都很好，实际用起来也不见得更好；它们在这里，是因为有些项目公布的是它们。

### 既然 MD5 破了，为什么还留着？

因为印在页面上的还是它。镜像站、固件下载、高校的软件页面，还有非常多厂商的网站，二十年前放了一个 MD5 就再没动过那一页。一个拒绝计算它的工具，等于拒绝回答访客真正带着来的那个问题。 \
\
它能做的是说清楚这个答案值多少，勾选框旁边那一行就是在做这件事。对上的 MD5 依然排除了一次损坏的下载，只是排除不了一次蓄意的调包。

### 比对框里可以粘哪些格式？

常见的都行，而且是哪一种由页面自己认出来。 \
\
光是十六进制，中间有没有空格都行。`md5sum` 或 `sha256sum` 的一行输出，后面跟着文件名也行。整份四十行的 `SHA256SUMS` 文件也行，这时用的是写着你这个文件名的那一行。 BSD 那种写法 `SHA256 (disk.iso) = …` 也行。前面带标签的 `SHA-256: …` 也行。还有 subresource integrity 属性 `sha384-…`，那是 base64 而不是十六进制，比对前会先解码。 \
\
是哪种算法由长度决定：32 个十六进制字符是 MD5，40 个是 SHA-1，64 个是 SHA-256，96 个是 SHA-384，128 个是 SHA-512。没有两种长度相同，所以既没有什么可选，也没有什么可选错。

### 结果会和 sha256sum 或 certutil 一样吗？

一样，一个字节都不差。这些是有公开测试向量的严格规范，这里的每一种算法在每次构建时都会拿那些向量和操作系统的实现两头核对。 \
\
唯一看得出的差别是显示方式。Windows 的 `certutil -hashfile` 用大写并且带空格，这个页面用小写，因为几乎所有发布方用的都是小写。比对时两边都不看大小写和空格，所以从 certutil 里复制来的校验和，和粘在这里的小写值一样能对上。

### 可以把两个文件互相比对吗？

可以，多一步而已：先校验第一个文件，复制它的校验和，再选第二个文件，把那串校验和粘进框里。两个文件相同的话，页面会告诉你。 \
\
这一手值得记住，因为校验和最不动声色也最擅长的正是这种场合：备份盘上的那一份，究竟是不是笔记本上的同一个文件，而两边都声称大小相同、日期相同。

### 它会改动我的文件吗？

不会。这个工具只读。没有输出文件，没有重新编码，也没有什么会被写回去：唯一能下载的是一个列着校验和的小文本文件。你的原件原封不动地留在磁盘上，这同样是「关掉标签页会怎样」这个问题的诚实答案。

### 免费吗？要不要账号？

免费，没有账号、没有注册、没有试用期。文件大小没有上限，校验多少个也没有上限。站点上有广告，那是维持它的钱；广告拿不到关于你文件的任何东西。

### 断网还能用吗？

能。把页面加载一次，然后断开网络，它照样工作。这也是证明什么都没有上传的最简单办法：一个把你的文件发出去算的工具，会在你拔掉网线的那一刻停住。

## 这条隐私承诺怎么核实

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **文件从不整个待在什么地方，多大都一样。** 它按每次四兆读进来，每一块并进正在进行的状态后就丢掉。所以这个页面占的内存，四十吉字节的磁盘镜像和一个文本文件是一样的，也不存在超过多大就放弃的界线。浏览器自带的 `crypto.subtle.digest` 没有被用上，原因也在这里：那个函数要求整个文件一次性进内存，而那正是这个工具不想要的天花板。
- **五种算法，这个仓库里的五个文件。** `src/md5.js`、`src/sha1.js`、`src/sha256.js` 和 `src/sha512.js` 是把公开的规范照着写下来，每个大约六十行，常数表是写出来的而不是算出来的，好让结果不会因为浏览器不同而不同。每一种在每次构建时都会拿官方测试向量和操作系统自己的实现两头核对。
- **你粘进来的校验和也哪儿都不去。** 比对就在这个页面里进行，比的是这里算出来的值。这次比对没有人会知道：不知道那个值，不知道对没对上，也不知道文件名。这件事比听上去要紧：一个校验和加上一个文件名，就等于告诉收走它的人，你刚刚下载的是哪个软件的哪一个构建。
- **谷歌加载了什么，又拿不到什么。** 广告和统计脚本来自谷歌。这两者都拿不到关于你文件的任何东西：文件、文件名、大小，以及算出来的任何一个值，都没有。每一行读取或处理字节的代码都由本站提供，并且都在仓库里。
- **赞助按钮加载了什么，又拿不到什么。** 页首那个「Buy me a coffee」按钮由 cdnjs.buymeacoffee.com 的脚本画出来，字体取自 Google Fonts。它只是一个链接：不上报访问，也拿不到关于你或你文件的任何东西。你不点它就什么都不会发生，点开之后到的是别人的网站。
- **断网也能用。** 断开网络，这个页面的每一部分照旧工作。这是最简单的一条证据：一个把你的文件发出去算的工具，会在你拔掉网线的那一刻停住。

**你可以自己核对。**上面这些不用你信。这个页面是仓库里的模板和配置生成出来的，构建脚本你能读，也能自己跑一遍，跑出来的结果就提交在 `dist` 分支上。拿实际发给你的内容，跟你自己从源码构建出来的结果对一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先读的几个文件：`config/site.toml` 里是 Content-Security-Policy，四个压缩函数分别在 `src/md5.js`、`src/sha1.js`、`src/sha256.js` 和 `src/sha512.js`，它们共用的填充在 `src/blocks.js`，把文件分块读进来的那个循环在 `src/hash.js`。这些文件里没有一行能够碰到网络。
