静态制品是一个目录,而不是一个可执行文件。只记录源码提交或只记录首页校验和会留下缺口:缺失的图片、陈旧的别名或变化的下载可能悄悄存活下来。一份发布清单应枚举每个常规文件。

生成稳定的列表

从制品根目录运行命令,使路径保持相对。在固定区域设置下按路径排序:

cd public
find . -type f -exec sha256sum {} + | LC_ALL=C sort -k2 > ../release.sha256

清单是关于制品的证据,因此把它放在被测量目录之外,除非清单本身有意作为发布的一部分。

传输后验证

在目标端,逐个文件验证:

cd /srv/www/site.new
sha256sum -c /path/to/release.sha256

这能捕获变化的字节与缺失的路径。它不会报告意外的多余文件,因此也要比较目标端的文件列表:

find . -type f | LC_ALL=C sort > destination.files
awk '{print $2}' /path/to/release.sha256 | LC_ALL=C sort > expected.files
diff -u expected.files destination.files

为发布记录增加聚合摘要

对清单自身做哈希,为日志与部署记录生成一个短标识:

sha256sum release.sha256

聚合摘要只有在清单生成规则固定时才有意义:相对路径形式、排序区域、哈希算法,以及是否包含生成的元数据,都属于流程的一部分。

不要把完整性等同于真实性

SHA-256 证明两个字节序列一致。如果攻击者既能替换制品也能替换清单,那么这种检查不能确立是谁产生的它们。制品签名与可信分发是独立的控制手段。

来源