所谓指纹,就是根据文件内容算出来的一串六十四个字符。文件里只要改一个字节,指纹就面目全非。正因如此,它能回答一个很具体的问题:我收到的这个文件,是不是就是别人打算发给我的那个?
正经的项目会把文件的指纹公布在下载链接旁边,就是为了让您能核对。路上被弄坏的文件、中断过的下载、供着旧版本的镜像站,或者被人换掉的文件:这四种情况在指纹上都看得出来。
而指纹说不了的是:它说不了这个文件是干净的。如果您是从放着文件的那同一个页面上取的指纹,而那个页面被做了手脚,两者当然对得上,您其实什么也没验到。指纹证明的是传输忠实,不是来源诚实。
怎么用
- 把您的文件拖到拖放区,或者点击选择。什么类型的文件都行:工具读的是字节,它不打算看懂内容。
- SHA-256 指纹马上就显示出来。按那个按钮可以把它复制到剪贴板。
- 要核对的话:把来源公布的指纹粘到那个框里,点“比对”。工具会说两者是否一致,并指出从哪里开始不一样。
支持的格式
这件工具不看您文件的内容:它读文件的字节并做散列。所以这里没有格式清单,也不存在因为格式而出岔子的可能。
任何文件
一张图片、一个压缩包、一个安装程序、一份文档、一段视频,或者一个您认不出的文件:散列的方式都一样。这里提供的四种函数都是浏览器自己带的,不依赖任何库。
它的限制
每个文件 500 MB
浏览器根本不提供分块散列:必须把整个文件一次性交给它,在内存里,放在一整块连续空间上。这是网页加密接口的限制,我们验过,不是我们自己定的。再往上,内存分配会失败,标签页就死了。
不提供 MD5
浏览器算不了 MD5:它的加密接口里没有这个函数,要加上就得内嵌一个库。而且这个函数在安全用途上已经坏了二十年。如果一个来源只公布 MD5,那就把这件事当成对这个来源的一个提示。
提供 SHA-1,但标明它已经坏了
老项目还在公布它,所以得能拿来比对。但人们已经会造出两个 SHA-1 相同的不同文件了:面对一个有恶意的人,它证明不了什么。用它来发现单纯的传输错误,仍然有用。
指纹对上了,并不证明文件是干净的
它证明的是您收到的文件跟给了您指纹的那个文件一致。如果指纹和文件来自同一个页面,而这个页面被做了手脚,这次核对就是空的。好的做法是从一个跟文件相互独立的来源去取指纹。
关于这个工具的问题
我的文件会被发到什么地方吗?
不会,而且您不必听我们的。按 F12 打开浏览器的开发者工具,切到“网络”标签页,清空列表,然后把文件放进来。一行都不会冒出来。您也可以把网断掉:工具照常工作。这一点在这里格外重要:人们去算一个文件的指纹,往往恰恰是因为不信任它。
指纹到底有什么用?
它只回答一个问题:这个文件跟给了我指纹的那个,是不是字节对字节完全一样?中断过的下载、开始出坏道的硬盘、供着旧版本的镜像站、半路被换掉的文件:这些都会让指纹变样。它不说内容如何,不说质量如何,也不说文件安不安全。
为什么不提供 MD5?
因为浏览器算不了:网页加密接口里没有 MD5,要加上就得内嵌一个库。更要紧的是,这个函数从 2000 年代起就坏了:用一台普通电脑就能造出两个 MD5 相同的不同文件。一个只公布 MD5 的来源,已经说明了它有多认真。
为什么上限是 500 MB?
因为浏览器的加密接口不提供分块散列:根本没有哪个函数能让您把文件一块一块喂给它。必须把整个文件一次性交给它,放在一整块内存里。超过某个点,内存分配就会失败,标签页也就死了。要算几个 GB 的文件,装在本机上的工具仍是对的选择,而三大系统上都已经自带了相应的命令。
指纹一致,那文件就安全了吗?
不是,而这是最普遍的一个误会。指纹一致证明的是:从公布指纹的那一刻到现在,文件没有变过。如果公布指纹的那个页面跟文件一起被做了手脚,两者会完美对上,而您什么也没验到。所以只要条件允许,就到下载页面以外的地方去找指纹。
两个不同的文件会有相同的 SHA-256 指纹吗?
理论上会,因为可能的文件比可能的指纹多。实际上,还没有人造得出这样的两个文件,而且相当长时间内也没人指望能造出来。SHA-1 那边就不一样了:2017 年就已经做到了,所以您选它的时候工具会提醒您。
我的指纹是大写的,你们的是小写的。
那是同一个。指纹用十六进制书写,大小写没有任何含义。工具比对时会忽略大小写、空格、换行,以及可能跟在后面的文件名,就像下载链接旁边那些校验和文件里的写法一样。