You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:12:38