玩Stable Diffusion的用户几乎都从Civitai或者各种网盘下载过模型,checkpoint动辄几个GB,LoRA也有上百MB。这些文件在传输过程中可能出现损坏,更危险的情况是被人为篡改过,也就是所谓的模型中毒事件。攻击者可以把恶意载荷藏进pickle格式的模型文件里,SD WebUI加载模型时会反序列化这些数据,恶意代码随之执行。要判断一个模型文件是否与作者发布的原始版本完全一致,最可靠的办法就是计算它的SHA256哈希值,再和官方公布的校验值进行比对。

为什么模型文件需要哈希校验
哈希校验的核心原理是单向散列函数。SHA256算法会把任意大小的文件运算成一个固定长度为256位的字符串,只要输入内容有任何一个字节不同,输出的哈希值就会发生巨大变化。因此同一个模型文件,无论在谁的电脑上计算,得到的SHA256值都应该完全一致,这就为文件完整性验证提供了客观依据。
模型中毒不是危言耸听。Python的pickle模块在设计上就不安全,反序列化恶意构造的pickle数据可以执行任意代码。安全研究人员已经多次演示过在.h换.pth、.ckpt、.pt等模型文件中嵌入反弹shell的攻击,SD WebUI早期版本加载模型时没有严格的沙箱隔离,风险确实存在。此外,下载工具的分块传输、网盘的多端同步也可能导致文件字节级损坏,这类非恶意损坏同样会通过哈希校验暴露出来,损坏的模型往往表现为加载报错或出图全是噪点。
Civitai在模型详情页提供了每个模型版本的SHA256哈希值,Hugging Face仓库也有对应的文件校验信息。拿到这些官方数值后,只需对本地文件做一次运算比对,就能确认文件是否原封不动。
如何计算并比对模型的SHA256值
Windows用户不需要安装额外软件,系统自带的certutil就能完成计算。打开命令提示符,切换到模型所在目录执行命令即可:
cd C:\stable-diffusion-webui\models\Stable-diffusion certutil -hashfile revAnimated_v122.safetensors SHA256
命令执行后会输出一串64位的十六进制字符,这就是该文件的SHA256哈希值。Linux和macOS用户可以使用sha256sum或者shasum命令:
cd ~/stable-diffusion-webui/models/Lora sha256sum my_lora.safetensors # macOS 可用 shasum -a 256 my_lora.safetensors
拿到本地哈希值后,与Civitai模型页面右侧的Hash字段比对。人工比对长字符串容易看走眼,建议只比对开头8位和结尾8位,如果这两段一致,中间部分几乎不可能出错。想更省事的话,Linux下可以直接把官方哈希值写进文本文件用sha256sum -c自动校验:
echo "a1b2c3d4e5f6...完整的64位哈希值 my_lora.safetensors" > check.txt sha256sum -c check.txt # 输出 my_lora.safetensors: OK 表示校验通过
需要提醒的是,部分网站会显示短哈希(前8位或前10位),这是为了方便搜索,不能作为完整的完整性校验依据。另外,pickle格式的.ckpt文件和safetensors格式即使内容等价,哈希值也完全不同,比对时务必确认官方公布的是哪个具体文件。
在SD WebUI中查看与利用模型哈希
SD WebUI本身会在加载模型时计算一个缩写哈希,你可以在界面的模型信息面板或者PNG图片元数据中看到类似a1b2c3d4的短哈希,生成图片的参数里也会自动带上这个值。这个短哈希可以直接拿到Civitai搜索,快速定位图片用的是哪个模型。不过要注意,界面显示的短哈希源自模型文件前若干字节的计算结果,不同版本的WebUI算法有过调整,它适合用来检索模型,不适合承担安全校验职责。
如果想系统性管理本地模型库,可以写一个简单的Python脚本批量计算所有模型的完整SHA256并导出清单,方便日后升级WebUI或迁移环境时核对:
import hashlib
from pathlib import Path
def sha256_of(file_path, chunk_size=1024*1024):
h = hashlib.sha256()
with open(file_path, 'rb') as f:
while chunk := f.read(chunk_size):
h.update(chunk)
return h.hexdigest()
model_dir = Path(r'C:\stable-diffusion-webui\models')
for f in model_dir.rglob('*.safetensors'):
print(f'{sha256_of(f)} {f.name}')脚本采用分块读取的方式,避免一次性把几GB的模型文件读进内存,即使在大目录上运行也很稳定。除了哈希校验,日常防护还应该做到几点:优先下载safetensors格式,它只存储张量数据而不包含可执行代码;尽量从Civitai官方页面或Hugging Face原始仓库获取模型,避开来路不明的转载网盘;保持SD WebUI为较新版本,新版本对不安全反序列化的限制更严格。把哈希校验变成下载模型后的固定动作,多花一分钟就能挡住大部分模型投毒风险。