PowerShell 校验下载文件:用 Get-FileHash 比对 SHA256
在 Windows 上核对下载文件,可用 Get-FileHash 计算 SHA256,再与发布者可信渠道提供的完整校验值比较。值不一致时先停止使用并核查版本与下载结果;值一致只支持文件内容匹配这一判断,不能单独证明发布者可信或软件没有恶意行为。
适用版本与前提
本文依据2026年11月4日查阅的 Microsoft Learn 文档,适用于 Windows PowerShell 5.1 及 Windows 上的 PowerShell 7.5。本文是官方资料整理,未对读者下载文件或目标环境实测,不提供任何安装包的实际校验值。Get-FileHash 的5.1用法见对应版本文档。
先确保下载已经完成,文件不会在计算过程中继续写入,并能读取该文件。准备与操作系统、架构、语言和确切版本相对应的官方 SHA256;不要把转载页或未知聊天消息中的一串字符当作可信基线。示例路径必须替换,哈希检查本身不运行安装包。
第一步:确认终端版本与计算目标
$PSVersionTable.PSVersion
Get-FileHash -LiteralPath 'D:\Downloads\package[1].zip' -Algorithm SHA256 | Format-List Algorithm, Hash, Path第一行显示当前 PowerShell 版本;第二行显式选用 SHA256,并显示算法、完整值及目标路径。LiteralPath 按字面解释路径,避免方括号等字符被当作通配模式。Get-FileHash 默认也是 SHA256,但显式写出便于审查脚本;参数定义见Get-FileHash 官方说明。
只改文件名不会改变内容哈希;计算的对象是文件内容。比较 ZIP、ISO 或安装包时应对照同一种文件,不能拿压缩包的哈希去比对解压后的程序。也不要用截断的终端列显示代替完整字符串比较。
第二步:把比较写成会明确失败的脚本
下面脚本通过交互输入官方校验值,先校验64位十六进制格式,再计算文件。只有读文件成功且值匹配时才输出一致;路径不存在、权限不足或不匹配都会报错。它不会自动执行文件或降低安全设置。
$targetFile = 'D:\Downloads\package[1].zip'
$expectedHash = (Read-Host '输入官方 SHA256').Trim()
if ($expectedHash -notmatch '^[0-9A-Fa-f]{64}$') {
throw 'SHA256 格式应为64位十六进制字符'
}
$actualHash = Get-FileHash -LiteralPath $targetFile -Algorithm SHA256 -ErrorAction Stop
if ($actualHash.Hash -ine $expectedHash) {
throw 'SHA256 不一致:请核对文件与官方版本'
}
'本次 SHA256 比较一致'Trim 只清理首尾空白,不能把带文件名的一整行自动解析为校验值;输入应只有哈希本身。-ine 作不区分大小写的不等比较。-ErrorAction Stop 防止读取错误后继续输出成功。官方也使用 Hash 属性与发布值比较,见发布值比较示例。
第三步:记录证据,理解验证边界
- 保留实际文件路径、版本与架构、计算时间、算法、完整计算值,以及官方校验值的出处和获取时间。
- 不一致时先排除版本、架构、语言或重新打包差异,再检查下载是否完整;重新从可信来源获取后重新计算,不要只修改预期值让检查通过。
- 一致时仍按组织的软件来源、签名和审批要求处理。哈希基线若也来自被篡改渠道,单次匹配无法独立排除风险。
对于支持 Authenticode 的 Windows 文件,可另外查看签名信息:
Get-AuthenticodeSignature -LiteralPath 'D:\Downloads\setup.exe' | Format-List Status, StatusMessage, SignerCertificate, Path该命令仅在 Windows 可用,返回签名状态等信息;无签名不等同于已经证实恶意,有效签名也不能替代软件来源和用途评估。应核对实际签名者是否符合预期。能力和平台边界见Get-AuthenticodeSignature 官方文档。
常见问题
为什么两次下载文件名相同,哈希却不同?
名称不能证明内容相同。先确认发布版本和文件来源,再核查文件是否仍在写入、被同步工具替换或重新打包。哈希不匹配给出的是内容不符的信号,不会自动告诉你具体原因。不要据此直接断言服务器被入侵。
官网只给 MD5 或 SHA1 怎么办?
不能把 MD5、SHA1 与 SHA256 的值互相比对。Microsoft 文档提醒 MD5 和 SHA1 不再适合抵御恶意攻击,优先寻找发布者提供的 SHA256 或可核验签名;旧算法结果不应升级为来源可信证明,见官方算法说明。
相关阅读
文件尚未下载成功时,先参考本站HTTPS 下载链路的 DNS、连接与证书排查,完成传输再做内容核验。该文示例面向 Linux curl,与本文 Windows PowerShell 命令的运行环境不同。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭