哈希校验需强制比对发布者提供的sha256值,pip download --hash是最轻量可靠入口;requirements.txt中--hash仅在pip install -r时生效但易过期,uv则默认并行校验pypi官方digests且不可关闭。

直接用 pip install 安装包,不校验哈希,等于默认信任整个下载链路——而 PyPI 本身不强制签名,镜像源、CDN、本地缓存都可能被污染。真正起作用的安全动作,是让 pip 在下载或安装时**强制比对发布者提供的 SHA256 哈希值**,不匹配就中断,不妥协。
pip download --hash 是最轻量可靠的校验入口
它不依赖你本地有没有缓存,也不要求你手动算哈希,而是让 pip 自己去比对官方元数据里的 digest(来自 PyPI 的 JSON API),失败直接报错,不静默跳过。
- 必须配合
--no-deps:否则 pip 会绕过哈希检查去解析依赖树 - 只校验原始分发包(
.whl或.tar.gz),不校验解压后内容 - 哈希值得自己找:访问
https://pypi.org/pypi/requests/json,在releases→ 对应版本 →digests.sha256字段里复制 - 命令示例:
pip download --no-deps --no-cache-dir --hash=sha256:abc123 requests==2.31.0
requirements.txt 里的 --hash 不是摆设,但容易失效
文件里写一堆 --hash=sha256:... 只有在用 pip install -r requirements.txt 时才生效;但它不是“一次生成永久有效”,一旦包作者上传新 wheel(哪怕只是换了个平台标签),旧哈希就作废。
构建并发布在 Quartz 平台上的韩语网络小说连载(草稿→封面→webp→章节 md→lint→发布),使用 Nano Banana Pro + ffmpeg。
- 失效表现:
THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE -
pip cache purge只能解决缓存损坏导致的误报,不能修复哈希过期 - 更新哈希的正解是重跑
pip-compile --generate-hashes requirements.in,而不是手改requirements.txt - 如果没
requirements.in,可用pip install --dry-run -r requirements.txt 2>&1 | grep "Collecting"辅助确认实际拉取的版本
uv 默认开启哈希验证,且不给你关的机会
如果你用 uv 替代 pip,哈希校验是开箱即用的——它从 PyPI 获取元数据时就拿到官方哈希,下载完立刻比对,不匹配直接拒绝安装,连 --no-verify-hashes 这种开关都只建议调试用,生产环境不该碰。
- 不需要额外配置,也不需要改
requirements.txt格式 - 比 pip 快 3–7 倍,哈希验证不拖慢速度,因为它是并行校验 + 预加载元数据
- 注意:uv 不读
pip-tools生成的--hash行,它用自己的机制查 PyPI,所以混用时别指望复用同一份哈希列表
哈希验证真正的复杂点不在怎么写命令,而在于你得清楚每个工具校验的是什么、从哪拿哈希、失效了怎么更新——pip 看的是你写的 --hash,uv 看的是 PyPI API 返回的 digests,而 pip-compile --generate-hashes 则是两者都查再合并。混用工具时,这些来源不一致,就是哈希不匹配的根源。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










