这个页面的代码没跑起来。

直接从文件夹里打开 index.html,浏览器会拦下 JavaScript 模块,于是你选好一个文件之后,页面不会有任何反应。改用 http 把这个文件夹提供出去:

powershell -ExecutionPolicy Bypass -File serve.ps1

然后打开 http://localhost:8080/。

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

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

语言: 简体中文
查看源码
你的文件在浏览器里处理,无须上传处理。

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

实时检查: 检查中…

离线: 检查中…

不必只听我们说。打开开发者工具,盯着「网络」面板,然后校验一个文件。没有任何一条请求带走它的一个字节,也没有带走文件名和大小。或者干脆断开网络,照样校验。

1 选择一个或多个文件

选择多个文件可与校验和清单逐一核对。每个文件都会分块读取,一次处理一个。重新选择会替换当前选择。

2 校验和

默认算 MD5 和 SHA-256,这两个加起来几乎覆盖了所有下载页面。再勾一个,文件就会为它重读一遍:慢的那一半是读,所以在选文件之前勾好的,一遍读完一起出。

要算哪些校验和

3 和本该是的值对一下

把下载页面给你的校验和粘进来。什么形式都不要紧:光是十六进制、sha256sum 的输出、整份 SHA256SUMS 文件、SHA256 (文件名) = … 这种写法,或者 script 标签上的 integrity 属性。是哪种算法由长度决定,所以没有什么要选的。

以 Markdown 查看

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

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

说得更细的版本

怎样用校验和核对下载的文件 在 Windows、macOS、Linux 或浏览器里比对 MD5 与 SHA-256 校验和的办法,对上了究竟证明了什么,以及那个让整件事白做的错误。

常见问题

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

不会。是你自己的浏览器从你的磁盘上读,你自己的处理器按每次四兆去算。这个工具没有服务端,页面的 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 里复制来的校验和,和粘在这里的小写值一样能对上。

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

可以,多一步而已:先校验第一个文件,复制它的校验和,再选第二个文件,把那串校验和粘进框里。两个文件相同的话,页面会告诉你。

这一手值得记住,因为校验和最不动声色也最擅长的正是这种场合:备份盘上的那一份,究竟是不是笔记本上的同一个文件,而两边都声称大小相同、日期相同。

它会改动我的文件吗?

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

免费吗?要不要账号?

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

断网还能用吗?

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