写这篇东西的起因很简单:我下载了一个几个G的数据库安装包,官网给了长长一串SHA256校验值。我习惯性地想找个校验工具,结果搜到的软件要么弹广告,要么装完发现是全家桶。后来一查才想起来,Windows系统本身就一直带着文件校验的命令,根本不用装第三方工具——一个叫CertUtil,一个叫Get-FileHash,前者是老牌选手,后者是PowerShell里的后起之秀。今天就把这两个命令怎么用、有什么区别、实战中怎么避坑一次说清楚,保证你看完就能用上。
这两个命令能做什么?简单说就是计算文件的哈希值。哈希值就像文件的“数字指纹”,文件内容只要有一个字节变了,哈希值就会完全不一样。所以校验文件是否完整、有没有被篡改、下载是否出错,全靠它。适合谁看?经常下载安装包、传大文件、玩开源软件、做系统部署的,都值得花三分钟搞清楚。
1. 为什么要用系统自带命令做文件校验
很多人的第一反应是“校验文件?下个软件不就行了”。我在早期也是这么干的,但用了几次第三方工具之后,就彻底放弃了。原因很现实:
第一是安全风险。文件校验工具本身就是你从网上下载来验证其他文件的,这就有个“先有鸡还是先有蛋”的悖论——你怎么知道你下载的校验工具是安全的?不少哈希校验工具确实干净,但也确实有一些捆绑了推广软件,甚至有些小众工具会偷偷上传你的文件信息。用系统自带的命令就完全没这个问题,CertUtil和Get-FileHash是微软官方内置的,不存在“下载工具”这一步,自然也就少了一个可能被攻击的环节。
第二是适用性。第三方工具很多是图形界面,看起来友好,但到了服务器上——尤其是Windows Server那种只有命令行界面的环境,图形工具根本用不了。而且服务器上你还不能随便装软件,万一是个内网环境、没有外网,想装个校验工具都费劲。系统自带命令这时候就成了唯一的选择。
第三是效率。熟练之后,命令行校验比打开图形界面、点按钮、找文件要快得多。尤其是批量校验多个文件时,写个for循环一下就搞定,图形工具反而一个个点累死人。
哈希校验本身的原理也不复杂。哈希算法(比如MD5、SHA-1、SHA-256)会把任意长度的文件内容通过数学变换,算出一串固定长度的字符串。这串字符串有几个特性:确定性(同一个文件每次算出来都一样)、单向性(从哈希值推不出原始内容)、雪崩效应(文件内容改一个字符,哈希值完全变样)。平时我们说的“SHA256校验”,就是拿官方公布的哈希值和本地计算出的哈希值做对比,两者一致就说明文件是完整无误的。
选择用哪个算法也有讲究。MD5和SHA-1目前都存在碰撞攻击的可能性,也就是说理论上可以构造出两个不同内容但哈希值相同的文件,所以安全性要求高的场景不建议用。SHA-256目前依然是主流且安全的,除非是校验老旧的软件包(有些老项目只提供MD5),否则我都推荐优先用SHA-256。
2. CertUtil命令详解
CertUtil大家可能有点陌生,但它其实是个“老资格”。它本来是Windows用来管理证书服务的命令行工具,功能很丰富,其中有一个子命令就是-hashfile,可以用来计算文件的哈希值。因为几乎所有的Windows系统都预装了它,所以知名度不高但实际使用率很高。
2.1 CertUtil基础语法
CertUtil校验文件的基本语法特别简单:
certutil -hashfile "文件路径" 算法其中“算法”是可选的,不写的话默认计算MD5。常见可用的算法有MD5、SHA1、SHA256、SHA384、SHA512等。
来看几个实际例子:
# 计算文件的MD5 certutil -hashfile "C:\Downloads\setup.exe" MD5 # 计算文件的SHA256 certutil -hashfile "C:\Downloads\setup.exe" SHA256 # 计算文件的SHA512 certutil -hashfile "D:\backup\data.zip" SHA512注意:文件路径如果包含空格,一定要加双引号。另外CertUtil的算法参数不区分大小写,写md5和MD5效果一样。
2.2 CertUtil实际输出效果
执行certutil命令后,输出是分三行显示的(我这里用实际文件名演示):
C:\>certutil -hashfile "C:\Downloads\ubuntu-22.04-desktop-amd64.iso" SHA256 SHA256 的 C:\Downloads\ubuntu-22.04-desktop-amd64.iso 的哈希: a4b8a4e6d0e3d2f4a8b9c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6 CertUtil: -hashfile 命令成功完成。中间那行就是哈希值。CertUtil输出的格式有个小特点:它会自动把哈希值拆成每行两个字符一组显示,如果你看到的哈希值很长,可能显示为多行。这其实是个坑点,后面我会专门说到。
2.3 CertUtil的局限与使用技巧
CertUtil最大的局限就是输出格式不友好。一方面它会输出三行内容,夹杂着“命令成功完成”这种提示信息;另一方面它没有复制按钮(在命令行窗口里复制比较麻烦),而且哈希值如果太长还会自动换行,直接复制去对比很不方便。
解决办法是使用命令行重定向,把结果输出到文件里,再打开文件来对比:
certutil -hashfile "C:\Downloads\setup.exe" SHA256 > hash.txt这样hash.txt里就只保留了命令输出的内容。不过照样还是那三行格式,没有只留哈希值的参数。
另一个非常关键的技巧:CertUtil是Windows自带的工具,默认就在系统PATH里,所以在CMD和PowerShell里都能直接调用。但有个特殊情况——如果你把文件路径写成了相对路径(就是不带盘符、不带完整目录的路径),建议还是先cd到文件所在目录再执行,否则可能出现找不到文件的报错。
CertUtil的老版本有个已知问题:带中文路径或中文文件名时,偶尔会出现编码错误,导致计算失败或者结果异常。这种情况一般切换成Get-FileHash就好,PowerShell对Unicode路径的支持要完善得多。
2.4 用CertUtil批量校验多个文件
为了弥补CertUtil单文件计算的低效,可以用for循环来批量处理。比如当前目录下有一堆.iso文件,要一次性全部算SHA256:
for %i in (*.iso) do certutil -hashfile "%i" SHA256注意:在CMD窗口里直接执行,用单个百分号;如果写在批处理脚本(.bat)里,百分号要写两遍,也就是%%i。这个是最容易踩的坑,我在实际写脚本时也经常忘记。
如果觉得输出太乱,可以一边计算一边写入日志文件:
for %i in (*.zip) do certutil -hashfile "%i" SHA256 >> hashes.txt>>是追加写入,用>是覆盖写入,批量场景下通常用>>保存多轮结果。
3. Get-FileHash命令详解
相比CertUtil,Get-FileHash是更“正规军”的存在。它是PowerShell的一个cmdlet命令,专做文件哈希计算,功能上就是冲着文件校验去的。PowerShell 4.0及以上版本都内置了,Windows 10、Windows 11、Windows Server 2012 R2及以后的系统都有,覆盖范围很广。
3.1 Get-FileHash基础语法
Get-FileHash的语法比CertUtil更好记,也更符合PowerShell的习惯:
Get-FileHash -Path "文件路径" -Algorithm 算法也来看几个实际例子:
# 计算文件的SHA256(不写-Algorithm默认就是SHA256) Get-FileHash -Path "C:\Downloads\setup.exe" # 计算文件的MD5 Get-FileHash -Path "C:\Downloads\setup.exe" -Algorithm MD5 # 计算文件的SHA1 Get-FileHash -Path "D:\backup\archive.zip" -Algorithm SHA1注意一个重要区别:Get-FileHash默认算法是SHA256,CertUtil默认是MD5。如果你在主流的文件下载站验证文件,站长提供的校验值通常是SHA256,那么用Get-FileHash时直接省略-Algorithm参数就行,反而更顺手。
3.2 Get-FileHash输出效果与格式化处理
Get-FileHash执行后输出的是一个结构化对象,包含三列:Algorithm(算法)、Hash(哈希值)、Path(文件路径)。看起来类似这样:
Algorithm Hash Path --------- ---- ---- SHA256 A4B8A4E6D0E3D2F4A8B9C7D6E5F4A3B2C1D0E9F8A7B6C5D4E3F2A1B0C9D8E7F6 C:\Downloads\setup.exe比CertUtil要清爽很多。但它也有个“麻烦”——默认输出的哈希值是一长串大写字母,而很多网站给出的校验值是小写字母,肉眼对比时容易看花眼。处理办法是格式化输出,转成小写:
(Get-FileHash -Path "C:\Downloads\setup.exe" -Algorithm SHA256).Hash.ToLower()这个写法是先取出Hash属性,然后调用ToLower()方法转成小写。输出就只有一行小写的哈希值,直接和网页上的对比,体验好很多。
如果只想提取哈希值而不想要其他信息,也可以直接用:
(Get-FileHash "C:\Downloads\setup.exe" -Algorithm SHA256).Hash3.3 Get-FileHash的高级用法
Get-FileHash还能一次处理多个文件,直接传入通配符或多个路径:
Get-FileHash -Path "C:\Downloads\*.iso" -Algorithm SHA256这样会把每个文件的哈希值都算出来,并附带文件路径,方便对应。这在批量校验场景下非常实用。
把哈希值直接写入文件方便对比,这也是很常用的操作。在PowerShell里这样做:
Get-FileHash -Path "C:\Downloads\setup.exe" -Algorithm SHA256 | Out-File -FilePath "D:\hash_result.txt"或者基于格式化字符串输出,风格更清爽:
$hash = Get-FileHash -Path "C:\Downloads\setup.exe" -Algorithm SHA256 Write-Output "$($hash.Hash.ToLower()) setup.exe"注意:直接在PowerShell里用>重定向也可以,但有个编码坑——PowerShell 5.1及以下版本默认重定向输出是UTF-16 LE编码,如果用记事本打开没问题,但一些老工具读这个文本文件可能乱码。这时候用Out-File -Encoding utf8显式指定编码更稳妥。
3.4 CertUtil与Get-FileHash的对比
我给这两兄弟做个直白的对比,谁好用、什么时候用谁,看这张表就清楚了:
| 对比维度 | CertUtil | Get-FileHash |
|---|---|---|
| 所属环境 | CMD | PowerShell |
| 默认算法 | MD5 | SHA256 |
| 输出格式 | 三行非结构化文本 | 结构化对象 |
| 大小写 | 不区分 | 输出为大写 |
| 多文件处理 | 需for循环 | 原生支持通配符 |
| 中文路径 | 偶尔编码异常 | 支持良好 |
| 路径友好性 | 必须加引号处理空格 | 同样需要引号 |
| 适用场景 | 快速验证、老系统 | 日常主力、脚本编写 |
我的使用经验是:日常主力优先Get-FileHash,因为输出可格式化、批量处理方便、编码问题少。但如果你是习惯了CMD的老用户,或者需要在不加载PowerShell的环境里快速算一个哈希,CertUtil也完全够用。两者可以并存,不必非要二选一。
4. 实战案例:下载系统镜像后如何核对SHA256
这一节用我最常遇到的场景来完整走一遍流程:下载了Linux发行版的.iso镜像,用自带的两个命令验证文件完整性。这个案例可以原样复制到其他场景——不管是软件安装包、数据库备份文件还是压缩包,思路完全一致。
4.1 第一步:拿到官方公布的哈希值
正规的软件下载页(比如Ubuntu、Debian、CentOS等),都会在下载按钮旁边提供校验值。可能是MD5、SHA256,也可能同时给好几种。你要做的就是复制官方提供的那个字符串,留着待会儿对比用。
以Ubuntu为例,下载页提供的通常是一段类似下面这样格式的SHA256校验值:
a4b8a4e6d0e3d2f4a8b9c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6 ubuntu-22.04-desktop-amd64.iso末尾的文件名很有用,因为有些网站会一次性列出一堆校验值,你要确保自己复制的那一行对应的是你下载的文件。还有个别项目会提供.sha256这样的独立校验文件,里面就是哈希值加文件名,逻辑一样。
4.2 第二步:用Get-FileHash计算本地文件哈希
打开PowerShell,执行:
Get-FileHash -Path "D:\Downloads\ubuntu-22.04-desktop-amd64.iso" -Algorithm SHA256注意PATH要改成你实际存放ISO文件的路径。如果文件特别大(好几个GB),命令会跑一会儿,终端里看起来像是“卡住了”,这是正常的——算大文件哈希本身就是全文件读取计算,速度取决于磁盘读写和CPU性能,别中途Ctrl+C打断了。
等待输出后,把输出的64位十六进制字符串和官方提供的那一行做对比。这一步我建议别用眼睛硬看,应该用电脑帮你对比。
4.3 第三步:快速对比哈希值
方法一:把官方值复制到一个文本文件比如expected.txt,把命令输出也重定向到另一个文件,然后用fc(文件比较命令)对比:
fc.exe expected.txt actual.txt如果输出“没有发现差异”,说明两者一致。
方法二:在PowerShell里直接用字符串比较,更精确。先把官方值存进一个变量,再和计算值比对:
$expected = "a4b8a4e6d0e3d2f4a8b9c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6" $actual = (Get-FileHash -Path "D:\Downloads\ubuntu-22.04-desktop-amd64.iso" -Algorithm SHA256).Hash.ToLower() if ($expected -eq $actual) { Write-Output "哈希值一致,文件完整" } else { Write-Output "哈希值不一致,请重新下载" }这个方法的好处是直接给出“一致/不一致”的结论,不用自己盯屏幕对比。实际用的时候,直接把$expected后面那一长串换成官方给出的校验值就行。
方法三:不想写变量的,也可以用CertUtil加findstr来过滤:
certutil -hashfile "D:\Downloads\ubuntu-22.04-desktop-amd64.iso" SHA256 | findstr /i "a4b8a4e6d0e3d2f4a8b9c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c9d8e7f6"如果命令能匹配到输出,就说明哈希一致。这个方法优雅但有个缺陷:如果需要比对的哈希值很长,直接写进命令行容易看漏;而且findstr默认不支持超长字符串匹配,实际情况中遇到哈希值超过128位十六进制字符时,需要换用PowerShell的-match运算符。
4.4 批量校验多个下载文件
一次下载了十几个文件,想一次性校验全部,在PowerShell里一条命令就行:
Get-ChildItem "D:\Downloads\*.iso" | Get-FileHash -Algorithm SHA256 | Format-Table -AutoSize这会列出所有iso文件的SHA256,然后你拿着结果和官方清单逐项对比。如果还想省事,做一个自动比对,可以把官方校验值保存成CSV,然后用脚本循环匹配——这是更进阶的玩法,但对大部分场景来说,手动对比已经完全够用了。
4.5 校验结果不匹配时怎么办
哈希值不一致,说明本地文件确实出了问题。根据我的经验,常见原因有几类:
- 下载不完整:网络中断导致文件只下了一半,点击文件名看大小,和官方标注的文件体积对比一下,少了肯定不对。
- 下载出错但文件大小一样:有些下载工具在文件下载完会做完整性校验但不报告细节,还是以哈希值为准。
- 文件被修改过:从非官方渠道下载的安装包,哈希值和官网对不上就要高度警惕,这种情况下建议直接放弃该文件,回到官网重新下载。
- 算法选错:比如官网给的是SHA256值,你本地却算了MD5,长度都不一样,当然对不上。先确认算法一致再对比。
值得提醒的是:如果官方同时给出了MD5和SHA256两个值,建议优先校验SHA256,因为SHA256的安全性远高于MD5,可以用更多校验维度来确认文件未被篡改。
5. 常见问题与排查技巧实录
我在各种机器上用过这两个命令,积累了一些容易踩的坑,现在统一列出来。很多问题看起来像是“电脑坏了”,实际上就是命令细节没注意到。
5.1 命令提示“不是内部或外部命令”
如果你在CMD里输入certutil提示“不是内部或外部命令”,先别慌。这通常是三种情况:
一是你用的是精简版系统,CertUtil确实被精简掉了。这种情况可以试着用PowerShell的Get-FileHash,它和PowerShell一起存在,一般不会被单独移除。
二是环境变量PATH被改坏了。CertUtil位于C:\Windows\System32目录下,正常情况下这个目录在PATH中。如果PATH里没有System32,那很多命令都会失效,不只是CertUtil。修复方式是打开系统环境变量设置,把%SystemRoot%\system32加回去。
三是最容易忽略的:你打开了PowerShell,但PowerShell的执行策略限制或解析方式导致命令被解释错。在PowerShell中调用外部命令certutil,建议用这样明确的调用方式:
certutil.exe -hashfile "C:\path\file.iso" SHA256注意加.exe后缀,这样PowerShell会把它当外部命令执行,而不是试图用PowerShell语法解释。
5.2 CertUtil输出哈希值换行导致对比失败
这个坑我栽过一次。大文件(超过某个大小后)的哈希值很长,CertUtil会在特定宽度处自动换行,把64位的SHA256哈希值拆成了多行。如果你在命令行窗口里直接手工复制,很容易只复制了一部分,拿去对比当然对不上。
解决方法是重定向到文件再打开文件复制,用certutil -hashfile加>重定向不会有换行问题(或者至少重定向到文件的输出是完整连续的),然后打开文件对比。
不过说句实在话,如果你经常需要做文件校验,用Get-FileHash更方便——它的输出是PowerShell对象,不存在这种换行带来的复制烦恼。
5.3 文件路径带空格或中文导致出错
命令行的老规矩:路径带空格必须加双引号。这个大家基本都知道,但中文路径偶尔出问题容易被忽略。CertUtil在某些系统语言设置下面处理中文路径确实会有编码异常,表现为“找不到文件”或哈希值异常。
最稳妥的办法:复制文件到纯英文路径下,比如C:\temp\,算完再删掉或移走。或者直接用Get-FileHash,它对Unicode的支持更好。
还有一种情况:PowerShell中如果路径中包含方括号[、]等特殊字符,也需要处理。PowerShell默认把方括号当作通配符处理,遇到这种路径建议加-LiteralPath参数,表示按字面路径解析,而不是通配符模式:
Get-FileHash -LiteralPath "C:\Downloads\file[1].iso" -Algorithm SHA256这个细节日常用不太到,但真踩到一次,排查起来很费时间。
5.4 服务器上PowerShell执行策略受限
在Windows Server上用PowerShell,有时候会碰到“脚本被禁用”或“因在此系统上禁止运行脚本”的错误。严格来说,这影响的是.ps1脚本文件,不会影响你手动执行Get-FileHash命令。但如果你把命令写进脚本文件,确实可能被策略拦下来。
临时绕过方式(需要在管理员权限的PowerShell里执行):
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass这个只对当前窗口生效,关掉窗口就恢复默认,不影响全局设置。如果是生产环境,建议先确认改策略不会违反公司安全规定,能不改就不改,手动敲命令也一样能算哈希。
5.5 哈希值大小写问题
Get-FileHash默认输出大写哈希值,CertUtil默认输出小写(实际上网站给的校验值通常小写居多)。比对的逻辑应该无视大小写,所以如果你的对比方法是用文本编辑器的“查找”或Ctrl+F,建议先统一大小写再比对,避免因为大小写问题误判不一致。
在PowerShell里可以用:
$actual.ToUpper() -eq $expected.ToUpper()统一转大写比较,或者都转小写比较,效果一样。哈希值的十六进制字符包括0-9和a-f(或A-F),转换大小写不影响信息本身。
5.6 计算大文件时“卡住不动”
单个几十GB的文件,读一遍盘去算哈希肯定需要时间,这是物理限制,不是命令卡死。判断到底是“在算”还是“真卡了”——看CPU占用,CertUtil和Get-FileHash计算时会持续占用一个CPU核心;再看磁盘活动,任务管理器里能看到磁盘读取的迹象。
如果两个指标都没变化,那可能真的卡死了,Ctrl+C取消,检查文件是否被其他进程锁定。另外,某些杀毒软件实时监控开启时,扫描大文件会拖慢速度,但一般不至于卡死。一个可选方案是算哈希之前暂时关闭文件实时监控,但要注意这是裸奔状态,别忘事后打开,不建议在重要机器上做这个操作。
还有一个性能心得:如果是在机械硬盘上做哈希大文件,速度会比较慢。SSD上快得多,但受制于接口限制和系统缓存影响。如果条件允许,把要校验的文件放到本地SSD上再算哈希,能省不少时间。
5.7 别忽略校验文件本身的完整性
这一步特别容易忽略:你从官网复制哈希值的时候,中间人篡改了官网页面,或者DNS被污染,导致看到的就是一个错误的哈希值,那怎么对比都对齐——而且这种对齐恰恰是最危险的。
所以我常年建议:重要文件的校验值至少从两个独立渠道确认。比如官网页面看一眼,再从官方GitHub仓库或官方邮件列表里的说明核对一遍。对于极重要的文件,甚至建议在隔离环境里做真实解压、运行测试,而不只是看哈希。
好在Windows自带的这两个命令最常见的用途,还是防下载出错、防文件损坏,这在日常使用中已足够。面对刻意伪造文件这类高威胁场景,光靠哈希校验是不够的,还需要数字签名、来源可信等多重手段配合。
6. 把文件校验做成小脚本
如果要频繁校验文件,手敲命令确实有点烦。这里分享一个我自用的批处理脚本思路,适合Windows下的日常快速校验。新建一个checkhash.bat文件,内容参考如下:
@echo off chcp 65001 >nul echo 请输入要校验的文件路径: set /p filepath= echo 请选择算法(1=MD5, 2=SHA1, 3=SHA256): set /p alg= if "%alg%"=="1" set algo=MD5 if "%alg%"=="2" set algo=SHA1 if "%alg%"=="3" set algo=SHA256 certutil -hashfile "%filepath%" %algo% pause这个脚本简单实用,支持拖拽文件到命令行窗口直接获取文件路径(Windows的CMD支持把文件拖到窗口里自动填充路径)。如果你想省去交互,也可以直接把算法和路径写死成参数版本,做成checkhash.bat "文件路径" SHA256这种用法。
PowerShell版则可以做成一个函数,放进Profile里随时调用:
function Get-HashOfFile { param( [Parameter(Mandatory=$true)] [string]$Path, [ValidateSet("MD5","SHA1","SHA256","SHA384","SHA512")] [string]$Algorithm = "SHA256" ) $hash = Get-FileHash -Path $Path -Algorithm $Algorithm Write-Output "$($hash.Hash.ToLower()) $($hash.Path)" }把这段函数加进PowerShell Profile文件,以后在任意目录敲Get-HashOfFile "C:\file.iso"就能直接拿结果,省事很多。把常用工具沉淀成函数或脚本,比每次临时敲一长串命令靠谱得多。
7. 两个命令之外的补充思路
CertUtil和Get-FileHash是Windows系统自带的主流方案,但也有一些场景需要搭配别的东西。
比如你要校验一个文件的SHA256,同时还想校验它的数字签名是否有效,那光有哈希值还不够。Windows下可以用PowerShell的Get-AuthenticodeSignature命令来检查数字签名:
Get-AuthenticodeSignature -FilePath "C:\Downloads\setup.exe"这会显示签名是否有效、签名者是谁、证书是否受信任。哈希校验和数字签名是两个维度的验证:哈希保证文件内容“没变”,签名保证文件来源“可信”。对于从网上下载的可执行文件,两个都验证一下会更稳妥。
再比如,你要比对的校验值存放在.sha256文本文件里,且文件数量很多,可以用这样一个PowerShell小脚本批量核对:
$checksums = Get-Content "C:\checksums.sha256" foreach ($line in $checksums) { $parts = $line -split '\s+' $expectedHash = $parts[0].ToLower() $fileName = $parts[1].Trim('*') $actualHash = (Get-FileHash -Path "C:\Downloads\$fileName" -Algorithm SHA256).Hash.ToLower() if ($expectedHash -eq $actualHash) { Write-Output "$fileName : OK" } else { Write-Output "$fileName : FAILED" } }这段脚本会逐行读取校验文件,将每行的预期哈希值和实际计算结果比对,最后输出每个文件“OK”或“FAILED”。注意校验文件的格式可能因项目而异,有的带星号(表示二进制模式),有的不带,所以Trim('*')和-split的规则需要根据实际情况微调。但核心思路是通用的,掌握了之后可以按需改造。
做文件校验这几年,我最大的体会就是:别小看命令行里的小工具,Windows自带的能力往往比想象中强大。CertUtil和Get-FileHash这两个命令每个Windows用户都内置了,平时用不上没关系,一旦需要验证一个系统镜像、一个安装包的完整性,它们就是你最可靠的后盾。真遇到哈希值对不上的情况,也别慌,按着上面整理的排查顺序一步步来——先确认算法一致、再确认文件完整、然后确认复制有没有遗漏,九成问题都能定位出来。最后再提醒一句:重要的哈希值,尽量多渠道比对;重要的文件,校验通过后再使用。