本文目录导读:

通过对文件内容进行哈希计算,得到一个固定长度的“指纹”(,然后与预期的正确指纹进行比对,如果两者一致,说明文件未被篡改或损坏。
下面我为你详细介绍几种常见的脚本校验方法,覆盖不同操作系统和语言。
核心概念:哈希算法
常用的哈希算法有:
- MD5:速度快,但安全性较低(有碰撞风险),常用于简单校验。
- SHA-1:比MD5安全,但已逐渐被弃用。
- SHA-256:目前最推荐使用的,安全性高,广泛用于下载校验。
- SHA-512:更安全,但计算稍慢。
校验流程:
- 获取预期哈希值:通常在文件下载页面或官方公告中,会提供文件的哈希值(如
file.zip.sha256文件或直接给出字符串)。 - 计算本地文件的哈希值:使用脚本对本地文件进行哈希计算。
- 比对:将计算出的哈希值与预期哈希值进行字符串比较。
Linux / macOS 终端脚本
这是最直接、最常用的方法,系统自带 md5sum, sha1sum, sha256sum, sha512sum 等命令。
使用 sha256sum 校验(推荐)
#!/bin/bash
# --- 配置 ---
FILE_PATH="/path/to/your/file.iso"
EXPECTED_HASH="请在此处粘贴正确的SHA256哈希值"
# --- 计算并比对 ---
echo "正在计算文件哈希..."
CALCULATED_HASH=$(sha256sum "$FILE_PATH" | awk '{print $1}')
# 注意:sha256sum的输出格式是 "哈希值 文件名",我们用 awk 提取第一部分
if [ "$CALCULATED_HASH" = "$EXPECTED_HASH" ]; then
echo "✓ 文件校验成功!哈希值匹配。"
else
echo "✗ 文件校验失败!哈希值不匹配。"
echo "预期哈希: $EXPECTED_HASH"
echo "实际哈希: $CALCULATED_HASH"
fi
如果想使用MD5或SHA-1,只需将 sha256sum 替换为 md5sum 或 sha1sum 即可。
使用 shasum 命令(macOS 通用)
macOS 中 shasum 命令可以指定算法。
#!/bin/bash
FILE_PATH="/path/to/your/file.dmg"
EXPECTED_HASH="预期SHA256哈希值"
ALGORITHM="-a 256" # 可选: -a 1 (SHA1), -a 224, -a 256, -a 384, -a 512
CALCULATED_HASH=$(shasum $ALGORITHM "$FILE_PATH" | awk '{print $1}')
if [ "$CALCULATED_HASH" = "$EXPECTED_HASH" ]; then
echo "✓ 校验成功!"
else
echo "✗ 校验失败!"
fi
Windows PowerShell 脚本 (推荐)
PowerShell 提供了强大的文件哈希计算功能。
基础校验脚本
# 设置参数
$filePath = "C:\Downloads\your_file.zip"
$expectedHash = "正确的SHA256哈希值(大写或小写均可)"
# 计算文件哈希 (默认是 SHA256)
Write-Host "正在计算文件哈希..."
$calculatedHash = (Get-FileHash -Path $filePath -Algorithm SHA256).Hash.ToLower()
# 比对 (字符串比较,忽略大小写)
if ($calculatedHash -eq $expectedHash.ToLower()) {
Write-Host "✓ 文件校验成功!" -ForegroundColor Green
} else {
Write-Host "✗ 文件校验失败!" -ForegroundColor Red
Write-Host "预期哈希: $expectedHash"
Write-Host "实际哈希: $calculatedHash"
}
批量校验文件夹内所有文件
# 设置目录和预期哈希(这里假设有一个“哈希值:文件名”的清单文件)
$directory = "C:\Downloads"
$hashFile = "C:\Downloads\checksums.sha256"
# 读取哈希清单(每行格式:哈希值 文件名)
Get-Content $hashFile | ForEach-Object {
$parts = $_ -split '\s+', 2
$expectedHash = $parts[0]
$fileName = $parts[1]
$filePath = Join-Path $directory $fileName
if (Test-Path $filePath) {
$calculatedHash = (Get-FileHash -Path $filePath -Algorithm SHA256).Hash.ToLower()
if ($calculatedHash -eq $expectedHash.ToLower()) {
Write-Host "✓ $fileName 校验通过" -ForegroundColor Green
} else {
Write-Host "✗ $fileName 校验失败!" -ForegroundColor Red
}
} else {
Write-Host "! 文件 $fileName 不存在" -ForegroundColor Yellow
}
}
Python 脚本 (跨平台)
如果你的环境中有 Python,可以使用 hashlib 库。
import hashlib
import sys
def calculate_hash(file_path, algorithm='sha256'):
"""计算文件的哈希值"""
hash_func = hashlib.new(algorithm)
try:
with open(file_path, 'rb') as f:
# 分块读取大文件,避免内存占用过高
for chunk in iter(lambda: f.read(8192), b''):
hash_func.update(chunk)
return hash_func.hexdigest()
except FileNotFoundError:
print(f"错误:文件未找到 - {file_path}")
sys.exit(1)
except Exception as e:
print(f"错误:无法读取文件 - {e}")
sys.exit(1)
def main():
file_path = input("请输入文件路径: ")
expected_hash = input("请输入预期的哈希值: ")
algorithm = input("请输入哈希算法 (默认 sha256): ").strip().lower() or 'sha256'
print(f"正在计算 {algorithm} 哈希...")
calculated_hash = calculate_hash(file_path, algorithm)
if calculated_hash == expected_hash.lower():
print(f"✓ 校验成功!哈希值匹配。")
else:
print(f"✗ 校验失败!哈希值不匹配。")
print(f"预期哈希: {expected_hash}")
print(f"实际哈希: {calculated_hash}")
if __name__ == "__main__":
main()
使用示例:
python checksum.py # 然后按提示输入文件路径、预期哈希和算法类型
注意事项与最佳实践
- 算法选择:对于安全敏感的场景,强烈推荐使用 SHA-256 或 SHA-512,MD5和SHA-1已被证明存在碰撞攻击风险,仅适用于非安全目的的简单校验。
- 大文件处理:不要一次性读取整个文件到内存(如
f.read()),应使用分块读取(如上面Python例子中的chunk方式)。 - 哈希来源:确保你获取预期哈希值的渠道是可靠的,如果哈希值本身被篡改了,校验就失去了意义,从官方网站或受信任的镜像站获取哈希值,而不是从某个论坛链接下载。
- GPG签名校验:对于开源软件或关键文件,官方通常会提供 GPG 签名文件(
.asc后缀),除了哈希校验外,还可用 GPG 校验签名,这不仅能验证文件完整性,还能验证文件的发布者身份,是更高级的安全校验方式。gpg --verify file.iso.asc file.iso
- 编写可重复使用的脚本:建议将上述代码封装成一个函数或独立的脚本工具,方便在不同的文件校验任务中重复调用。
- Linux/macOS:直接用
sha256sum命令配合 shell 脚本。 - Windows:使用 PowerShell 的
Get-FileHash命令。 - 跨平台:Python 的
hashlib库是最灵活可靠的选择。
根据你常用的操作系统和编程环境,选择一种方法,将文件路径和预期哈希值替换成实际值即可进行校验。