Python3 crypt模块被弃用后,适配yescrypt的合适替代方案是什么?
替代Python crypt模块的可行方案
针对你遇到的yescrypt支持、自动适配系统哈希算法的需求,这里有几个靠谱的替代方向:
1. 扩展passlib以支持yescrypt
passlib默认确实没包含yescrypt支持,但可以通过安装扩展包来启用:
- 执行
pip install passlib[yescrypt](前提是你的系统已经安装了支持yescrypt的底层库,比如libcrypt2 1.4.0及以上版本) - 启用后就能用
passlib.hash.yescrypt.verify(plain_password, hashed_password)验证yescrypt哈希 - 要是需要自动适配系统支持的所有哈希,passlib的
CryptContext可以配置成自动检测:初始化时设置schemes=["auto"],它会自动尝试系统支持的所有算法,和原crypt模块的行为一致
2. 调用系统原生crypt命令行工具
用Python的subprocess调用系统自带的crypt命令,完全复用系统支持的所有哈希算法(包括yescrypt):
import subprocess def check_password(plain_pw, hash_str): proc = subprocess.run( ["crypt", plain_pw, hash_str], capture_output=True, text=True ) # 验证成功时,命令会输出匹配的哈希,且返回码为0 return proc.returncode == 0 and proc.stdout.strip() == hash_str
这种方式完全和系统的crypt实现对齐,不需要额外依赖密码库,能支持所有系统原生支持的哈希类型。
3. 用cryptography库的yescrypt实现
如果你只需要处理yescrypt哈希,新版本的cryptography已经内置了yescrypt的实现,可以直接用其底层模块来验证:
from cryptography.hazmat.primitives.kdf.yescrypt import Yescrypt import base64 def verify_yescrypt(plain_pw, hash_str): # 解析yescrypt哈希的格式($y$j9T$salt$hash) parts = hash_str.split("$") if parts[1] != "y": raise ValueError("输入的不是yescrypt格式哈希") # 提取参数、盐值和存储的哈希 param_segment = parts[2] salt = base64.b64decode(parts[3].encode(), altchars=b"./") stored_hash = base64.b64decode(parts[4].encode(), altchars=b"./") # 解析rounds参数(param_segment格式如j9T,其中9T对应rounds值) rounds = int(param_segment[1:], 36) kdf = Yescrypt(salt=salt, rounds=rounds) try: kdf.verify(plain_pw.encode(), stored_hash) return True except: return False
不过这种方式需要手动解析哈希结构,没法自动适配所有算法,适合只需要处理yescrypt的场景。
内容的提问来源于stack exchange,提问作者plugwash
相关产品推荐
相关产品推荐

