被换过的文件和原版看起来一模一样:同样的名字、同样的大小、同样的图标。能把它们分开的只有校验和 (文件内容的短指纹:改一个字节,整个指纹都变)。你下载的文件的校验和与作者公布的一致,那就是同一个文件。不一致,那就是另一个文件,不要运行。下面讲:替换是从哪儿来的,怎么一秒钟算出校验和,参考值该从哪儿拿,校验才有意义。
| 为什么要比校验和 | |
|---|---|
| 作者那儿的文件 | SHA-256: a3f9… |
| 你这儿的文件 | SHA-256: a3f9… 一样 |
| 你这儿的文件 | SHA-256: 71c0… 不一样 |
| 名字和大小 | 可以一样 |
| 校验和 | 不可能碰巧一样 |
哈希是什么,最简单的说法
拿任何一个文件,哪怕一个 GB,过一遍公式。出来的永远是 64 个字符,同一个文件永远是同样的 64 个。文件里改一个字节,64 个字符全变,和原来的毫无关系。从这些字符倒推不回文件,但用它们比较两个文件只要一秒,不用比文件本身。
打个比方:它像指纹。看指纹认不出这个人长什么样,但两枚指纹一比,就知道是不是同一个人。这就是哈希,也叫校验和。作者用自己的文件算出来并公布。你用自己的文件算出来,比一下。一致,两个文件到最后一个字节都相同。公式是公开的、全世界一样的,所以 Windows 上算的校验和可以和 Mac 或浏览器里算的比。
替换是从哪儿来的
网站和你的硬盘之间有一段路,文件可以在路上被换掉。「下载更快」的镜像站。酒店里被感染的路由器。往未加密网页里塞广告的运营商。有人坐在中间的公共 Wi-Fi。还有最常见的一种:你不是从官网下的,而是从「另一个地方,东西一样」下的,以为它是一样的。
HTTPS 挡得住前面几种,挡不住最后一种。你自己去了别人的网站、自己下了别人的文件,加密通道会忠实地把假货送到你手上。校验和给的答案很直接:这是不是作者发布的那个文件。
对 VPN 客户端来说这一点尤其重要。一个即将拿到你全部流量权限的文件,值得在安装前查,而不是安装后。从不明来源的应用商店装安卓客户端有什么风险,在科学上网教程里提过。
怎么算校验和
打开文件校验和,把文件拖进去。默认算 SHA-256 (标准的指纹算法,64 个字符),SHA-1、SHA-512 和 MD5 一键切换,看作者公布的是哪种。文件不会被上传到任何地方:它在标签页的内存里读取,过程中没有任何网络请求,你可以在开发者工具的「网络」标签里确认。
手里有参考值的话,贴进旁边的输入框:页面自己会说「一致」或「不一致」,不用你肉眼比 64 个字符。
在电脑上不用浏览器也行:
Windows: certutil -hashfile 文件名 SHA256
macOS: shasum -a 256 文件名
Linux: sha256sum 文件名
任何系统结果都一样。这就是全部意义:校验和只取决于内容,不取决于谁用什么算的。
参考值从哪儿拿
这里是最常出错的地方。参考值要从你信任的来源拿,而不是从你拿到那个可疑文件的同一个地方。文件在镜像站上被换了,旁边的校验和也一起被换了,它们会「一致」。那样的校验毫无意义。
正确的做法:文件从哪儿来都行,校验和从作者的官网拿。我们在每个下载旁边都放了一个 .sha256 文件:404vpn.apk.sha256、404vpn-macos.dmg.sha256、tunnel.apk.sha256。参考值就在里面。从任何镜像下了客户端,去下载页拿校验和,比一下。
| 校验和从哪儿来 | |
|---|---|
| 文件和校验和都来自镜像 | 没用 |
| 文件来自镜像,校验和来自作者 | 真正的校验 |
| 文件和校验和都来自作者 | 真正的校验 |
| 规则 | 文件不是作者给的,校验和就必须是 |
校验和不一致:说明什么
说明这不是同一个文件。原因有无害的和有害的,分辨起来很简单。
无害的。 你下了另一个版本:作者更新了文件、页面上的校验和还没更新,或者反过来。下载没下完。浏览器顺手把压缩包解开了。这几种情况下,从官网重新下载就会一致。
有害的。 从同一个地方重新下了一遍,校验和还是对不上作者的,而作者官网上的文件对得上。说明那个地方放的是另一个文件。里面是什么你不会知道,也不需要知道:不运行,删掉。
一条简单的规则:不一致不是「再仔细看一眼」,而是「一致之前不要运行」。
校验和查不了什么
校验和只证明文件从作者算出参考值那一刻起没变过。它不说作者是否可信,也不说文件有没有 bug。你信任作者,校验和就保证你拿到的是他的文件。你不信任,校验和帮不了你:它会用同样的精度确认一个恶意文件确实出自你错信的那个人。
它也不能代替签名。签名还回答「这是谁发布的」,校验和只回答「是不是同一个东西」。对下载的应用来说,只要校验和来自你信任的网站,通常够用了。
说实话,我自己不会什么都查。我查三类:拿到大权限的应用(VPN、杀毒、任何能碰系统的东西),镜像站和种子下来的文件,以及陌生人发来的链接里的一切。花一秒,可能省下很多。
| 什么时候必须查 | |
|---|---|
| 大权限的应用 | 查 |
| 镜像站或种子下来的文件 | 查 |
| 陌生人给的文件 | 查 |
| 校验和不是从文件来源处拿的 | 这一条让前三条有意义 |
校验和对不上、又分不清原因是否无害,把两个值和文件的来龙去脉交给 AI。
帮我分析文件校验和为什么对不上。
文件:(是什么,从哪儿下的)。
参考值来自:(作者官网 / 文件旁边 / 不清楚)。
我算的:(贴上)。参考值:(贴上)。
重新下过:(下过,还是一样 / 没有)。
告诉我这更像是版本不同或没下完,还是被换了,
下一步该做什么。不要建议我运行这个文件。
一句话总结
- 名字和大小能伪造,校验和不能。
- 拖进去,拿到 SHA-256,和作者官网上的参考值比。
- 一致:就是那个文件。不一致:不要运行。
- 最大的错误:参考值从可疑文件的同一个来源拿,那样校验等于没做。