使用已有用户数据库开发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
相关产品推荐
相关产品推荐

