升级Fedora39与cryptography41后,密钥派生报错:Expected instance of hashes.HashAlgorithm
升级Fedora 39 Beta与cryptography后加密功能失效的问题排查
问题核心
升级到Fedora 39 Beta,同时将cryptography从37.0.2升级到41.0.3/41.0.4后,所有加密功能失效,底层Rust代码抛出TypeError: Expected instance of hashes.HashAlgorithm,此前在Fedora 38 + cryptography 37.0.2环境下代码可正常运行。这大概率是新版本的严格类型检测触发了旧代码中隐藏的不规范写法,而非环境本身的bug。
常见触发原因及修复方案
1. 直接传递哈希算法类而非实例
旧版本cryptography对传参的校验较宽松,允许直接传递hashes.SHA256这类类对象而非实例,但40+版本开始强制要求传入已实例化的HashAlgorithm对象。
- 错误写法:
from cryptography.hazmat.primitives import hashes # 直接传类,旧版本兼容,新版本报错 hash_alg = hashes.SHA256 - 修复写法:
hash_alg = hashes.SHA256() # 必须实例化后传递
2. 自定义哈希类未合规实现接口
如果你的代码中有自定义哈希实现,新版本对hashes.HashAlgorithm接口的校验更严格。需要确保自定义类:
- 明确继承自
hashes.HashAlgorithm - 实现所有必需的属性(如
name、digest_size)和方法
3. Rust-Python交互的类型传递错误
底层Rust代码调用Python侧的cryptography库时,可能传递了错误的类型(比如传递了类对象、字符串或其他非实例对象)。需要检查Rust代码中调用Python哈希对象的逻辑,确保传递的是已正确实例化的HashAlgorithm实例。
快速验证方法
写一段最小化测试脚本,确认哈希实例的正确性:
from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC # 测试哈希实例是否符合要求 try: hash_alg = hashes.SHA256() kdf = PBKDF2HMAC( algorithm=hash_alg, length=32, salt=b'example_salt', iterations=100000, ) kdf.derive(b'test_password') print("哈希实例验证成功") except TypeError as e: print(f"验证失败:{e}")
如果这段脚本运行正常,再逐步引入原有代码的逻辑,定位具体哪个模块的传参存在问题。
内容的提问来源于stack exchange,提问作者NORMAN BRAKE
相关产品推荐
相关产品推荐

