abox.tools

语言: 简体中文

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

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

打开哈希与校验和 把下载来的文件和发布方公布的那串数字对一下,不用把它发给任何人。

以 Markdown 查看

简短的回答

打开哈希与校验和,把下载好的文件拖进去,再把下载页面上的校验和粘到下面那个框里。页面会从长度看出那串数字是哪种算法,然后用一句话回答。

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

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

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

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

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

你面前的是哪一种

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

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

结果卡片:同一个文件的 MD5、SHA-1、SHA-256 和 SHA-512 摘要,每个后面都有复制按钮。
一次全给出来,因为该用哪一个是发布文件的一方定的,不是你定的。

不用浏览器,在自己机器上做

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

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-…"。然后用一句话回答是或不是。

比对卡片:一串校验值被粘进输入框,下面给出与文件相符的判定。
把下载页面上写的那串粘进来,比对交给工具。盯着屏幕数六十四个字符,正是它要省掉的那一步。

对上了,究竟证明了什么

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

对上了,可以排除:

对上了,排除不了:

让整件事白做的那个错误

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

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

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

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

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

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

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

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

对不上,现在怎么办

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

为什么要在浏览器里做

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

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