rpm -V 校验已安装文件与RPM数据库中记录的元数据一致性,检查权限、所有者、大小、修改时间、MD5等属性;输出如S.5.T.表示大小、MD5、时间变化,c表示配置文件。

rpm -V 校验的是已安装文件,不是 RPM 包本身
直接运行 rpm -V package_name 并不能验证你手头那个 .rpm 文件是否被篡改——它只比对「已安装到系统里的文件」和「RPM 数据库里记录的原始元数据」。也就是说,这个命令检查的是 /usr/bin/foo 是否被改过,而不是你下载的 foo-1.2.3-1.el9.x86_64.rpm 这个包文件本身有没有被替换或损坏。
如果你手里有一个 RPM 包文件(比如从非官方源下载的),想确认它是不是原始、未被篡改的版本,必须跳过 rpm -V,转而校验该 RPM 文件自身的哈希值。
用 sha256sum 校验 .rpm 文件完整性最可靠
MD5 已不推荐用于安全校验,RPM 包本身是二进制文件,sha256sum 是当前事实标准。你需要把下载的 RPM 文件哈希值,和上游(如发行版仓库、项目官网)明确提供的 SHA256 值做比对。
- 计算本地 RPM 文件的 SHA256:
sha256sum foo-1.2.3-1.el9.x86_64.rpm - 输出形如:
a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a0b0 foo-1.2.3-1.el9.x86_64.rpm - 只取哈希部分(方便脚本处理):
sha256sum foo.rpm | cut -d' ' -f1 - 如果上游提供的是
.sha256校验清单(常见于 CentOS/RHEL 镜像站),下载后执行:sha256sum -c foo.rpm.sha256,注意该文件必须包含正确路径或在同目录下运行
关键点:校验清单里写的路径必须和你当前执行命令时的 RPM 文件路径一致;若清单写的是 ./foo.rpm,你就得在同级目录下运行,不能 cd 进子目录再跑。
为什么不用 rpm --checksig?它不校验内容完整性
rpm --checksig package.rpm 看起来很相关,但它只验证 GPG 签名是否有效、签名密钥是否可信,并不计算或比对 RPM 文件本身的哈希值。一个被恶意替换但签名仍有效的 RPM(比如攻击者盗用了私钥)或一个签名被剥离但内容完好的 RPM,--checksig 都可能通过——它防的是“身份伪造”,不是“文件篡改”。
真正防篡改,必须依赖哈希比对。GPG 签名 + SHA256 校验才是双保险:签名保证来源可信,SHA256 保证字节未变。
别忽略 RPM 包内嵌的 MD5(但别依赖它)
老版本 RPM 包(v3/v4)在构建时会把包内每个文件的 MD5 写进包头元数据,rpm -qpi package.rpm 可能显示类似 Signature : (none) 或带 MD5 的行,但这只是构建时快照,无法防止包文件自身被篡改。而且现代 RPM(v5+)默认不再存 MD5,改用 SHA256。
所以:不要试图从 RPM 包里“提取它的 MD5 来比对”,它要么不存在,要么不可信。唯一可信的参照,永远是上游发布的、独立于 RPM 文件之外的校验值(SHA256 最佳)。











