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

使用已有用户数据库开发Django网站的密码校验与存储相关问题

Django对接存量无加盐哈希用户库的新用户密码存储解决方案

前置准备

首先确认存量数据库的密码哈希规则,这是所有操作的前提:

  • 取1~2条已知明文密码的存量用户记录,用常见无加盐哈希算法(MD5、SHA1、SHA256等)计算明文密码的哈希值,和库中存储的值对比,即可确定对应算法。
  • 同时确认是否存在固定前缀/后缀拼接逻辑,比如部分老系统会采用md5(固定字符串+用户密码)的规则存储,需要同步匹配逻辑。

核心实现:自定义Django密码哈希器

Django原生支持自定义密码哈希器,配置后新用户注册会自动用指定规则存储密码,同时兼容存量用户的校验逻辑,无需修改注册、认证的核心业务代码。

步骤1:编写自定义哈希器

在项目根目录下新建hashers.py文件,示例为无加盐MD5规则,可根据实际算法调整:

import hashlib
from django.contrib.auth.hashers import BasePasswordHasher, mask_hash

class LegacyUnsaltedHasher(BasePasswordHasher):
    algorithm = "legacy_unsalted_hash"

    def encode(self, password, salt=None):
        # 按存量规则计算密码哈希,以下为无加盐MD5示例,可替换为对应算法逻辑
        return hashlib.md5(password.encode('utf-8')).hexdigest()

    def verify(self, password, encoded):
        return self.encode(password) == encoded

    def safe_summary(self, encoded):
        return {
            'algorithm': self.algorithm,
            'hash': mask_hash(encoded),
        }

    def must_update(self, encoded):
        # 暂时不需要升级哈希规则则返回False,后续要迁移到安全哈希时改为True即可
        return False

步骤2:修改项目配置

打开settings.py,调整PASSWORD_HASHERS配置,将自定义哈希器放在列表第一位:

PASSWORD_HASHERS = [
    # 替换为你项目中自定义哈希器的实际导入路径
    'myproject.hashers.LegacyUnsaltedHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]

注意事项

  • 若存量规则为其他哈希算法,仅需修改encode方法中的哈希计算逻辑即可,比如将hashlib.md5替换为hashlib.sha1。
  • 无加盐哈希安全性极低,存在撞库泄露风险,后续可通过将must_update返回值改为True,实现用户首次登录时自动将密码升级为Django默认的加盐哈希格式,完成平滑迁移。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 05:06:04