怎么校验下载的文件
- 选择文件并拖入下载好的文件;或者选择文本,计算输入文字的哈希值。
- 五种哈希值会一起算出,大文件会显示读取进度。
- 把下载页上公布的校验值粘贴到期望的校验值里,大小写和空格都不影响。如果某个哈希值与之相同,那一行会变绿,并提示是哪种算法。
- 如果都不一致,说明这不是发布者发布的那个文件:可能下载不完整、传输中损坏,或者被人替换过。请从官方渠道重新下载。
什么是哈希值
密码学哈希函数把任意长度的数据变成一个固定长度的「指纹」。同样的输入总是得到同样的哈希值;哪怕只改一个比特,哈希值也会面目全非;对于安全的哈希算法,既无法找到两个哈希值相同的不同输入,也无法从哈希值倒推出原始数据。这正是用哈希校验下载的原理:发布者公布原始文件的哈希值,你计算收到的文件的哈希值,只有两个文件逐位完全相同,两者才会一致。
该信任哪种算法
| 算法 | 长度 | 现状 |
|---|---|---|
| MD5 | 128 位(32 个十六进制字符) | 已被攻破,可以故意构造碰撞;只适合发现意外损坏 |
| SHA-1 | 160 位(40 个十六进制字符) | 已被攻破,2017 年已有实际碰撞;不要用于安全用途 |
| SHA-256 | 256 位(64 个十六进制字符) | 安全,下载校验最常用 |
| SHA-384 | 384 位(96 个十六进制字符) | 安全 |
| SHA-512 | 512 位(128 个十六进制字符) | 安全 |
收录 MD5 和 SHA-1,是因为很多较老的下载页仍然只公布这两种,而且它们仍能可靠地发现意外损坏的文件。但它们防不住有人故意替换文件,因为攻击者可以构造出 MD5 或 SHA-1 相同的不同文件。发布者提供 SHA-256 时,请优先使用 SHA-256。
本页是怎么计算的
SHA 系列使用浏览器内置的 Web Crypto 接口。MD5 不在 Web Crypto 里,所以在本页按 RFC 1321 实现,并用 RFC 自带的测试值、以及在 3 MB 随机数据上与 Node.js 的结果做过核对。文本会先按 UTF-8 转成字节再计算,所以同样的中文文本,结果和 UTF-8 系统上的命令行工具一致。
哈希不等于密码存储
SHA-256 这类快速哈希不应该单独用来保存密码:它们的设计目标就是快,而这也让猜测变得很快。保存密码需要专门设计得很慢、并且加盐的算法,比如 Argon2、bcrypt 或 scrypt。
示例
| 输入 | 算法 | 哈希值 |
|---|---|---|
| 空文本 | MD5 | d41d8cd98f00b204e9800998ecf8427e |
abc | MD5 | 900150983cd24fb0d6963f7d28e17f72 |
abc | SHA-1 | a9993e364706816aba3e25717850c26c9cd0d89d |
abc | SHA-256 | ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad |
这些是 RFC 1321 和 FIPS 180-4 里的标准测试向量,可以用来确认任何哈希工具是否工作正常。命令行里的对应做法是:macOS 和 Linux 上用 shasum -a 256 文件名,Windows 上用 certutil -hashfile 文件名 SHA256。
常见用法:下载系统镜像、开发工具安装包之后,对照官网公布的 SHA-256 核对一遍,确认文件没有在镜像站或网盘转存时被篡改。
局限
- 超过 512 MB 的文件不计算 SHA 系列。 Web Crypto 只能一次性对整个文件计算,需要把整个文件读进内存。MD5 按 4 MB 分块计算,多大的文件都行。
- 文本按 UTF-8 计算,换行完全按输入的来。 末尾多一个换行,哈希值就不同,这是不同工具对同一段文字算出不同结果最常见的原因。
- 不支持 HMAC 等带密钥的哈希,也不支持 SHA-3、BLAKE 系列,Web Crypto 没有提供这些算法。
常见问题
怎么用校验值验证下载的文件?
在这里计算下载文件的哈希值,把官网公布的校验值粘贴到「期望的校验值」里。出现绿色的一行,就说明文件与官方发布的完全相同。
文件会被上传吗?
不会。文件在你的浏览器里读取和计算,这也是对私密文件计算哈希唯一安全的做法。
MD5 还安全吗?
用于安全目的已经不安全。它能发现意外损坏,但攻击者可以构造出 MD5 相同的不同文件。能用 SHA-256 就用 SHA-256。
为什么两个工具对同一段文字算出的哈希不一样?
通常是因为看不见的差异,比如末尾多了换行、换行符不同,或者文字编码不同(UTF-8 与 GBK)。
哈希值能还原成原文吗?
不能,哈希是单向的指纹。但对于很短、容易猜的输入,攻击者可以逐个尝试再比对,所以密码需要专门的慢哈希。