一、校验在防什么
两种完全不同的问题:
- 传输损坏:网络中断、磁盘坏道导致文件缺了几个字节。表现是安装报错、解压失败,哈希一比立刻现形。
- 内容被替换:下载源被劫持,给你一个捆绑了木马的安装包。哈希与官方公布值不一致就能发现(前提是哈希来自可信渠道)。
第一种是工程问题,第二种是安全问题。哈希校验对两者都有效,所以是分发流程的标准动作。
二、命令行校验
# 单个文件
sha256sum ubuntu-24.04.iso
shasum -a 256 ubuntu-24.04.iso # macOS
# 与官方公布值比对(忽略大小写差异)
echo "d4a0...9f ubuntu-24.04.iso" | sha256sum -c -
# 官方给了 SHA256SUMS 文件时,批量校验
sha256sum -c SHA256SUMS
# ubuntu-24.04.iso: OK
Windows PowerShell:
Get-FileHash .\setup.exe -Algorithm SHA256 | Format-List
几个细节:Linux 下 sha256sum 输出「摘要 + 两个空格 + 文件名」,-c 模式要求格式一致;文件名含空格时官方文件里会用 \ 转义,直接改文件名会导致校验失败。
三、在浏览器里算
不想装工具、或文件在别人的机器上,可以用 文件哈希校验:拖入文件,在本地用 Web Crypto 计算 SHA-256,文件不会被上传。适合校验合同、发票、安装包这类不方便传到第三方的文件。
大文件要注意:几百 MB 以上浏览器计算会占用内存和时间,建议用命令行;纯文本的摘要用 SHA 计算 更快。
四、校验通过就安全吗
不完全是。哈希只能证明「与公布摘要时一致」,还需要:
- 摘要在独立渠道获得(官网 HTTPS 页面、签名邮件),不能和文件放在同一台服务器。
- 官方最好同时提供代码签名(Windows 的数字签名、macOS 公证),这层能验证发布者身份,哈希做不到。
- 校验的是最终产物:如果先解压再运行里面的脚本,压缩包的哈希就管不到解压后的内容了。
所以完整的信任链是:HTTPS 下载 → 哈希校验 → 代码签名验证 → 沙箱/杀毒扫描。
五、校验失败怎么办
| 现象 | 可能原因 |
|---|---|
| 摘要完全不同 | 下载不完整、下错版本、被替换 |
| 只差最后几位 | 复制时截断,或大小写/空白干扰 |
| 同一文件两次算出不同值 | 文件在计算过程中被修改,或读的是缓存副本 |
| 文本文件哈希对不上 | 换行符被转换(CRLF/LF),要用二进制模式 |
处理顺序:重新下载 → 核对版本号和文件名 → 用二进制模式重算 → 对比官方多算法(有些站点同时给 MD5 和 SHA-256)→ 仍不一致就不要运行。
六、给文件做「指纹」的其它用法
- 去重:同一份文件上传多次,用哈希判断是否已存在,省存储。
- 版本比对:发布前后各算一次,确认产物真的变了。
- 取证留痕:交付文件时记录哈希,事后可证明「这份文件没被改过」。
- 缓存键:用内容哈希做缓存标识,内容变则键变。
这些场景用 SHA-256 都合适;MD5 只在对方系统只支持它时用,并且清楚它不抗对抗性篡改。
小结
下载必校验,命令是 sha256sum / shasum -a 256;批量用 -c;摘要必须来自独立可信渠道;文本文件记得二进制模式;不一致就别运行。