1. 引言

在 Linux 系统中,文件完整性校验是一项基础且重要的操作。无论是下载软件包、备份数据,还是验证文件在传输过程中是否损坏,我们都需要一种可靠的方法来确保文件内容没有被篡改或破坏。

Linux 提供了多种文件校验命令,其中最常用的包括 md5sumsha1sumsha256sumsha512sum 以及较新的 b2sum。本文将系统介绍这些命令的用法、区别及实战场景,帮助你根据需求选择合适的校验工具。

2. 文件校验的基本原理

文件校验的核心是哈希函数(Hash Function),它将任意长度的输入数据映射为固定长度的输出值(哈希值或摘要)。哈希函数具有以下特性:

  • 确定性:同一文件始终产生相同的哈希值。
  • 单向性:从哈希值无法反推出原始文件内容。
  • 雪崩效应:文件内容的微小变化会导致哈希值完全不同。
  • 抗碰撞性:很难找到两个不同文件具有相同的哈希值。

文件校验的基本流程是:先计算原始文件的哈希值并保存,之后重新计算文件的哈希值并与保存的值对比,如果一致则说明文件未被修改。

3. 常用校验命令详解

3.1 md5sum

md5sum 是最早广泛使用的校验命令,基于 MD5 算法,输出 128 位(16 字节)的哈希值。

# 计算文件的 MD5 哈希值
md5sum ubuntu-24.04-desktop-amd64.iso

# 生成校验文件
md5sum *.iso > md5sums.txt

# 校验文件完整性
md5sum -c md5sums.txt

注意:MD5 算法已被证明存在严重的安全漏洞(碰撞攻击),不推荐在安全敏感场景中使用。

3.2 sha1sum

sha1sum 基于 SHA-1 算法,输出 160 位(20 字节)的哈希值。

# 计算文件的 SHA-1 哈希值
sha1sum ubuntu-24.04-desktop-amd64.iso

# 生成并校验
sha1sum *.iso > sha1sums.txt
sha1sum -c sha1sums.txt

注意:SHA-1 同样已被证明存在碰撞攻击,Google 和 CWI 研究所已在 2017 年成功演示了 SHA-1 碰撞。

3.3 sha256sum

sha256sum 基于 SHA-256 算法(SHA-2 家族),输出 256 位(32 字节)的哈希值,是目前最推荐的通用校验工具。

# 计算文件的 SHA-256 哈希值
sha256sum ubuntu-24.04-desktop-amd64.iso

# 生成校验文件
sha256sum *.iso > sha256sums.txt

# 校验
sha256sum -c sha256sums.txt

3.4 sha512sum

sha512sum 同样是 SHA-2 家族成员,输出 512 位(64 字节)的哈希值,安全性更高但计算开销也更大。

sha512sum ubuntu-24.04-desktop-amd64.iso

3.5 b2sum

b2sum 基于 BLAKE2 算法,是现代 Linux 系统中较新的校验工具,从 coreutils 8.26 版本开始被正式包含。

# 计算 BLAKE2b 哈希值(默认 512 位)
b2sum ubuntu-24.04-desktop-amd64.iso

# 指定哈希长度(例如 256 位)
b2sum -l 256 ubuntu-24.04-desktop-amd64.iso

# 生成并校验
b2sum *.iso > b2sums.txt
b2sum -c b2sums.txt

4. 命令通用选项

这些校验命令的语法高度一致,以下是常用选项:

选项描述
-b, --binary以二进制模式读取文件(默认行为)
-c, --check从校验文件中读取哈希值并进行校验
-t, --text以文本模式读取文件
--tag创建 BSD 风格的校验和输出
--ignore-missing在校验时忽略不存在的文件
--quiet校验成功时不输出信息
--status不输出任何信息,仅通过退出码表示结果
--strict遇到格式不正确的校验行时返回非零退出码
-w, --warn遇到格式不正确的校验行时发出警告

5. 实战案例

5.1 下载 ISO 镜像后校验

这是最常见的场景,以 Ubuntu 系统为例:

# 1. 下载 Ubuntu ISO 镜像
wget https://releases.ubuntu.com/24.04/ubuntu-24.04-desktop-amd64.iso

# 2. 下载对应的 SHA256 校验文件
wget https://releases.ubuntu.com/24.04/SHA256SUMS

# 3. 校验文件完整性
sha256sum -c SHA256SUMS --ignore-missing

# 输出示例:
# ubuntu-24.04-desktop-amd64.iso: 成功

5.2 批量校验目录中的文件

# 为 /var/log 目录下所有 .log 文件生成校验文件
find /var/log -name "*.log" -exec sha256sum {} \; > log_checksums.sha256

# 稍后校验这些日志文件是否被修改过
sha256sum -c log_checksums.sha256

5.3 在脚本中使用静默校验

#!/bin/bash
# 静默校验,仅通过退出码判断结果

if sha256sum --status -c checksums.sha256; then
    echo "所有文件校验通过"
else
    echo "文件校验失败,请检查完整性"
    exit 1
fi

5.4 查找重复文件

利用哈希值可以快速查找目录中的重复文件:

# 查找当前目录下所有文件的 SHA-256 哈希值,并按哈希值分组
find . -type f -exec sha256sum {} \; | sort | uniq -w 64 -d

5.5 备份数据完整性检查

#!/bin/bash
# 备份脚本:生成备份并创建校验文件

BACKUP_DIR="/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/backup_${TIMESTAMP}.tar.gz"

# 创建备份
tar -czf "$BACKUP_FILE" /important/data

# 生成 SHA-256 校验文件
sha256sum "$BACKUP_FILE" > "${BACKUP_FILE}.sha256"

echo "备份完成:${BACKUP_FILE}"
echo "校验文件:${BACKUP_FILE}.sha256"

恢复时校验:

sha256sum -c backup_20260625_093000.tar.gz.sha256

6. 各命令对比与选型建议

特性md5sumsha1sumsha256sumsha512sumb2sum
算法MD5SHA-1SHA-256SHA-512BLAKE2b
输出长度128 位160 位256 位512 位512 位(可调)
安全性低(已破解)低(已破解)极高极高
速度中等较慢非常快
可定制长度是(8-512 位)
密钥支持是(HMAC)
GNU Coreutils是(8.26+)

选型建议

  • 日常使用:优先选择 sha256sum,安全性与性能的平衡最佳。
  • 高安全场景:使用 sha512sumb2sum
  • 兼容旧系统:可能需要使用 md5sumsha1sum,但应尽快迁移。
  • 追求性能b2sum 在速度上具有明显优势,且安全性不输 SHA-2。
  • 需要可变长度输出b2sum 是唯一支持自定义哈希长度的工具。

7. 总结

Linux 提供了丰富的文件校验命令,从经典的 md5sum 到现代的 b2sum,覆盖了不同安全等级和性能需求。本文详细介绍了这些命令的用法、选项和实战案例,帮助你掌握文件完整性校验的核心技能。

在实际工作中,建议遵循以下原则:

  • 新项目优先使用 sha256sumb2sum
  • 避免在安全场景中使用 md5sumsha1sum
  • 下载重要文件时务必校验官方提供的哈希值
  • 在备份脚本中加入自动校验机制

掌握这些命令,你就能在 Linux 系统中轻松确保文件的完整性和安全性。