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

如何在FastAPI应用中验证Django哈希密码?遇UnknownHashError报错

解决Django迁移FastAPI的密码验证UnknownHashError问题

问题根源

你的错误是因为Passlib无法识别Django生成的pbkdf2_sha256$260000$格式哈希串——Django的PBKDF2哈希有自己的特定结构(前缀+迭代次数+盐+哈希值),而你配置的通用pbkdf2_sha256 scheme不兼容该格式。同时代码中存在笔误,导致密码处理逻辑错误。

修复步骤

  1. 修正密码获取的笔误
    代码里的password = pwd._context(form.get("password"))是错误写法:pwd._context是无效变量,且Passlib的verify方法需要接收明文密码,无需提前哈希。直接改为:

    password = form.get("password")
    
  2. 修改CryptContext的Scheme配置
    将通用的pbkdf2_sha256替换为Passlib专门适配Django的django_pbkdf2_sha256 scheme,这个scheme能正确解析Django生成的哈希格式:

    pwd_context = CryptContext(schemes=["django_pbkdf2_sha256"], deprecated="auto")
    

完整修正后的代码

# Security config
security = HTTPBasic()
pwd_context = CryptContext(schemes=["django_pbkdf2_sha256"], deprecated="auto")


async def login(request: Request):
    form = await request.form()
    username = form.get("username")
    password = form.get("password")  # 修正笔误,直接取明文密码
    db = database.SessionLocal()
    user = db.query(models.User).filter(models.User.username == username).first()

    if not user or not pwd_context.verify(password, user.password):
        raise HTTPException(status_code=401, detail="Invalid username or password")
    token = create_jwt_token(user.id)
    response = RedirectResponse(url="/index", status_code=301)
    response.set_cookie(key="token", value=token)
    return response

验证逻辑说明

Passlib的verify方法会自动完成以下操作:

  • 解析数据库中Django格式的哈希串,提取迭代次数、盐值等参数
  • 用相同参数对明文密码进行哈希计算
  • 对比计算结果与数据库中的哈希值是否一致

这样就能正确完成密码验证,不再触发UnknownHashError。

内容的提问来源于stack exchange,提问作者Noelia Fdez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:35:17