如何解决升级后Python3.9无法正常调用scrypt加密算法的问题
根因说明
Python调用OpenSSL的逻辑
- 无论是CPython内置的
hashlib模块,还是第三方cryptography库,都是在软件编译构建阶段检测依赖的OpenSSL的功能支持列表,而非运行时动态识别OpenSSL的可用算法。编译时检测到的特性开关会直接固化到最终生成的二进制文件中。 - 你遇到的现象不属于动态链接异常:你已经验证
cryptography可以正确读取当前OpenSSL的版本号,说明两者的动态链接关系完全正常,问题出在编译阶段的特性检测结果。
为什么OpenSSL支持scrypt但Python识别不到
你的嵌入式系统升级时应该仅替换了OpenSSL的动态库文件,没有基于新版OpenSSL重新编译Python 3.9和cryptography库:
- 编译Python 3.9时如果依赖的OpenSSL版本低于1.1.0,或者编译配置关闭了scrypt支持,最终生成的Python二进制就会直接去掉
hashlib.scrypt的相关实现,即使后续升级OpenSSL动态库也不会恢复。 - 编译
cryptography库时如果检测到当时的OpenSSL不支持scrypt,就会默认关闭ScryptBackend的相关实现,后续即使链接了支持scrypt的新版OpenSSL,也不会启用该后端,就会抛出你遇到的UnsupportedAlgorithm异常。
解决方案
- 重新编译Python 3.9:编译时确保依赖当前已安装的新版OpenSSL 1.1.1l,编译完成后即可直接使用
hashlib.scrypt的内置实现,无需额外依赖。 - 重新编译
cryptography库:在当前新版OpenSSL环境下重新编译安装cryptography,编译过程会自动检测到OpenSSL的scrypt支持并启用对应后端,原有调用Scrypt类的代码无需修改即可正常运行。 - 独立安装scrypt实现:也就是你已经采用的方案,直接安装
python3-scrypt库,该库自带独立的scrypt算法实现,不依赖系统OpenSSL的功能支持,兼容性最强,适合嵌入式场景快速修复问题。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

