pip install 时需在requirements.txt中为每个包显式声明--hash=sha256:xxx(多平台哈希可并列),且必须源自PyPI直接下载后用pip hash生成;仅写包名或版本号不触发校验,setup.py/pyproject.toml不支持哈希语法。

pip install 时如何指定包的精确哈希值
直接在 requirements.txt 中写死哈希值,pip 才会在安装时校验。只写包名或带版本号(如 requests==2.31.0)完全不触发哈希校验——哪怕你本地 pip freeze --hash 输出了哈希,也不代表安装时会验证。
正确写法必须同时满足两个条件:显式声明哈希算法 + 提供完整哈希值 + 指定来源(PyPI 或 URL)。例如:
requests==2.31.0 \
--hash=sha256:abc123...def456 \
--hash=sha256:ghi789...jkl012
注意:--hash 必须紧跟在包声明行末尾,用反斜杠换行;多个哈希值是为兼容不同平台构建的 wheel(比如 macOS 和 Linux 的 wheel 可能不同,但内容一致,所以提供多哈希)。
- 只写一个
--hash值,若 pip 下载到另一个哈希的 wheel(比如平台不匹配时 fallback 到源码包),安装会失败 - 哈希值必须来自官方 PyPI 发布的 wheel 或 sdist,自己 build 的包哈希不被信任
- 使用
pip install -r requirements.txt时,pip 默认启用哈希验证;但若加了--trusted-host或--index-url指向非 PyPI 源,需额外确认该源是否支持哈希分发(多数私有源不支持)
生成可信哈希值的唯一安全方式
别手动算哈希,也别复制别人给的哈希——必须用 pip 自己从 PyPI 拉取后生成。最可靠路径是:先用 pip 下载包(不安装),再用 pip hash 计算。
立即学习“Python免费学习笔记(深入)”;
操作步骤:
- 运行
pip download requests==2.31.0 --no-deps --no-binary :all:(强制下载 sdist)或去掉--no-binary下载 wheel - 进入下载目录,对每个文件执行
pip hash <filename></filename>,它会输出sha256:<hexstring></hexstring> - 把所有输出的哈希值都写进
requirements.txt对应行的--hash后面
为什么不用 pip freeze --hash?因为它只输出当前已安装包的哈希,而安装过程本身可能已被中间人污染(比如 pip index 被劫持过),源头不可信。必须从 PyPI 直接下载再算,才构成可信链。
setup.py / pyproject.toml 中无法锁定哈希值
setup.py 的 install_requires 和 pyproject.toml 的 dependencies 字段只接受 PEP 508 版本规范(如 requests>=2.28.0),不支持 --hash 语法。这些字段描述的是「构建依赖」,不是「安装约束」。
真正起锁定作用的只有 requirements.txt(或通过 pip-compile 生成的锁文件)。如果你用 pip install . 安装本地包,它的依赖仍会走普通解析流程,忽略任何你在项目里手写的哈希。
- 想让 CI/CD 环境也强制校验?必须在部署命令中显式用
pip install -r requirements.txt,而不是pip install . -
pip-tools的pip-compile支持--generate-hashes,它会自动下载、校验并写入哈希,比手写更稳,但底层仍依赖上述下载+hash 流程 - 注意:某些旧版 pip(HashMismatch 错误请升级 pip
常见报错和绕过哈希验证的风险点
最典型错误是 HashMismatch 或 Could not satisfy constraints for 'xxx': installation from path or url cannot be constrained to a hash。前者多因哈希值过期(PyPI 重新发布同版本包)、平台不匹配;后者常发生在你试图对 git+ 或本地路径依赖加 --hash——pip 明确禁止这么做,因为这类来源无法保证内容稳定。
- 不要用
--force-reinstall或--no-deps绕过哈希检查,这等于主动放弃完整性保护 - 私有 PyPI 源(如 Nexus、Artifactory)若未开启
hashes支持,上传包时不会附带哈希元数据,pip 下载后自然无法校验——得去源端配置「enable hash upload/download」 - Windows 用户注意:CRLF 换行可能让
requirements.txt中的哈希行被截断,导致解析失败;建议统一用 LF
哈希锁定不是“设了就一劳永逸”的开关,它依赖整个链条:PyPI 发布时附带哈希 → pip 下载时保存哈希信息 → 你用 pip 正确生成并写入 → 安装时 pip 严格比对。任一环松动,防护就失效。最容易被跳过的其实是第一步——很多团队自己 build 包上传到私有源,却没同步上传哈希文件(RECORD 或 hashes.json),结果锁了个寂寞。


















