简短的回答
打开哈希与校验和,把下载好的文件拖进去,再把下载页面上的校验和粘到下面那个框里。页面会从长度看出那串数字是哪种算法,然后用一句话回答。
对得上,说明你磁盘上的字节就是发布方量过的字节。对不上,就先重新下载,再谈打开。下面写的是这句话省掉的部分。
下载链接底下那串数字是什么
是一个哈希函数的输出:一种读遍文件每一个字节、给出一个又短又定长的答案的算法。同一个文件永远给出同一个答案,而只差一个二进制位的文件会给出完全不同的答案——不是相近的答案,是毫不相干的答案。整件事就靠这个性质撑着。
既然答案很短而文件不短,这道算术就必然丢掉信息,也就必然有很多文件共用同一个答案。有意去找出其中一个,才是难的那一半;而难到什么程度,正是下面这些算法彼此的区别。
校验和没有什么是保密的,也没有办法倒推回去。它是一枚指纹,公布出来,好让两个人能就「我们手上是同一个东西」达成一致。
你面前的是哪一种
你不用挑。发布方已经挑好了,你要做的是算出同一种。光看长度就能分辨:
- 32 个十六进制字符 — MD5.
- 40 — SHA-1.
- 64 — SHA-256,这也是你最常见到的一种。
- 96 — SHA-384.
- 128 — SHA-512.
没有两种长度相同,所以工具能够在没人告诉它的情况下认出你粘进来的是什么。一串 63 个字符的东西不是任何东西的校验和:那是一个在去剪贴板的路上掉了一个字符的 SHA-256。
不用浏览器,在自己机器上做
每个操作系统都自带能做这件事的工具,而且就算你用网页来做,知道这条命令也值得。对于「我怎么知道你们站算得老实不老实」这个问题,没有比把同一个文件喂给你自己电脑自带的工具更好的回答了。
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 在浏览器里,就是哈希与校验和的比对框。它按发布方写下来的样子收:光是十六进制、sha256sum 的一行、整份 SHA256SUMS 文件、SHA256 (disk.iso) = … 这种写法,或者从 script 标签上扒下来的 integrity="sha384-…"。然后用一句话回答是或不是。
对上了,究竟证明了什么
证明你磁盘上的这些字节,就是某个人写下那串数字时手边的那些字节。这确实值得知道,也比多数人以为的要窄,所以值得把它管得着和管不着的分别列出来。
对上了,可以排除:
- 一次提前停住、却给你留下一个看着完整的文件的下载;
- 传输途中、快坏的硬盘上,或者一根劣质 USB 线造成的损坏;
- 拿错了文件:本该 x86 却拿了 ARM,或者拿的是上个月的发布;
- 一个不声不响地发着与它所宣称不同的东西的镜像站。
对上了,排除不了:
- 这个文件是恶意的。发布方量恶意软件和量别的东西一样准。校验和说的是「这就是他们发出来的东西」,从来不是「这个东西安全」;
- 发布方本身被攻破了。能把服务器上的文件换掉的人,会在同一分钟里把下面那行校验和也换掉。这就说到下一节了。
让整件事白做的那个错误
从和文件同一个页面、同一条连接上取校验和。
想一想你在防什么。如果担心的是下载坏了,校验和从哪儿来都行,这次核对是有效的。如果担心的是有人动过这个文件,那么能换掉文件的人也能换掉印在下面的那行十六进制,因为两者来自同一台服务器、同一条连接。你等于是在请伪造者确认签名。
校验和最值钱的时候,是它走的路和文件不同的时候:
- 一份带分离 GPG 签名的
SHA256SUMS,用你本来就有的密钥去验。发行版就是这么做的,这才是真正的答案; - 从邮件列表的发布公告或者源码仓库的标签上取,而不是从下载页面上取;
- 从另一个域名下的第二个镜像取一份,再把两份彼此对照;
- 交给包管理器,它会用随操作系统一起来的密钥替你做这件事。
这些都不意味着核对同页面上的校验和就没用了。它抓得住坏掉的下载,而那正是真会落到人身上的故障。只是别对自己说它还抓住了别的什么。
MD5 和 SHA-1 已经破了。有时候还是照用
两者都在这里要紧的那个最强意义上破了:碰撞可以被刻意造出来。同一个 MD5 的两个不同文件,从 2004 年起用普通硬件就能做出来;2017 年一个团队做出了同一个 SHA-1 的两份不同 PDF。到 2020 年,能自选前缀的那种攻击已经降到几万美元的租用算力。
落到实处就是:对上的 MD5 不再能告诉你没人动过这个文件,因为想动的人本来就能造出一个同值的另一个文件。它仍然能告诉你下载没有被截断、没有损坏,因为随机的意外不会正好撞上一个碰撞——那种概率是任何意外都没有过的。
所以,如果发布方只印了一个 MD5,那就核对它:这比不核对强。而如果发布的人是你,请印一个 SHA-256。
对不上,现在怎么办
- 重新下一次,还从同一个地方。断掉或者续传过的传输是遥遥领先的头号原因,第二份副本通常就把事情了结了。
- 确认你比的是那一行。发布页面上会列好几个文件:安装包的校验和永远不会和压缩包的对上,ARM 的也不会和 x86 的对上。
- 确认版本。收藏起来的校验和页面,在小版本发布的那天就过期了。
- 换一个镜像试试,再把两份文件的校验和彼此对照。两个镜像彼此一致却都和公布的数字不同,和一个镜像同时和另外两者不同,是两种不同的问题。
- 在弄清楚之前不要打开它。一个通不过校验和的文件,往好里说是损坏了,往坏里说根本不是你要的那个文件。
为什么要在浏览器里做
因为命令行不是大多数人待的地方;也因为那个显而易见的替代方案——一个让你把文件传上去的网站——用来对付一个你本来就在怀疑的安装包,是件很奇怪的事。为了弄清楚文件有没有在路上被动过手脚而把它发到别处,等于又多加了一个可以被动手脚的地方。
哈希与校验和按每次四兆在你自己的机器上读这个文件,所以没有上传、没有大小上限,除了页面本身之外也没有别的需要你信任的东西;而那个页面你读得到,拔掉网线它照样工作。如果你更愿意信自己的操作系统,就跑上面那一节的命令,再把两个答案对一下。它们会一样。