本文目录导读:

Django 的密码哈希算法确实是一直在升级的,核心变化主要围绕 PBKDF2 的迭代次数以及新算法的引入(如 Argon2, bcrypt)。
截至 Django 5.x 版本,最新的默认算法是 django.contrib.auth.hashers.PBKDF2PasswordHasher,但其迭代次数(iterations) 在每次大版本发布时通常会提高约 20-30%,以抵御硬件算力的提升。
当前主流版本(Django 4.x / 5.x)的默认哈希配置
- 默认算法:
PBKDF2+SHA256 - 默认迭代次数:720,000 次(约 72 万次,Django 5.1 及后续小版本中还会微调)
- 盐值:随机 12 字符(字母+数字)
对比历史版本的变化:
| Django 大版本 | 默认算法 | 迭代次数 | 备注 |
|---|---|---|---|
| x | PBKDF2 | 720,000 | 自 5.0 开始显著提升 |
| x | PBKDF2 | 600,000 | 2 开始升级 |
| x | PBKDF2 | 390,000 | 1/3.2 逐步提升 |
| x | PBKDF2 | 180,000 | |
| x | PBKDF2 | 36,000 - 100,000 | |
| x | MD5 / SHA1 | 原始哈希 | 已废弃,极弱 |
新增的算法支持(超越 PBKDF2)
除了提升 PBKDF2 的轮数,Django 还引入了更先进的、抗 ASIC/GPU 攻击的算法。
-
Argon2(推荐)
-
引入版本:Django 2.0(作为
django.contrib.auth.hashers.Argon2PasswordHasher) -
特性:2015 年密码哈希竞赛的获胜者,专门为抵抗 GPU 和 ASIC 破解设计,是当前最安全的选择。
-
如何使用:你可以在
settings.py中将其设为第一优先级(即默认算法):PASSWORD_HASHERS = [ 'django.contrib.auth.hashers.Argon2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2PasswordHasher', # ... 其他兼容算法 ]
-
-
bcrypt
- 引入版本:Django 1.4(作为第三方支持,后内置)
- 特性:经典抗 GPU 算法,但不如 Argon2 灵活。
- Django 内置:
django.contrib.auth.hashers.BCryptSHA256PasswordHasher
升级的幕后机制:自动升级
Django 最强大的特性之一是密码哈希的自动升级,这不需要你手动跑任何迁移脚本。
- 触发条件:当用户成功登录时,Django 检测到该用户的密码哈希使用的是更旧的算法(例如迭代次数只有 36万次,而现在默认是 72万次),它会自动重新计算哈希,并更新数据库中的哈希值。
- 配置顺序决定行为:
PASSWORD_HASHERS列表的第一个元素是默认算法。- 当用户登录时,如果他的密码哈希算法不在列表里(例如你删除了 MD5),密码会被拒绝,通常需要提示用户重置密码。
如何检查你项目的算法状态?
命令行检查:
# 查看当前 Django 环境下的默认算法和迭代次数 python -c "from django.contrib.auth.hashers import PBKDF2PasswordHasher; print(PBKDF2PasswordHasher.iterations)"
数据库中检查(例子):
auth_user 表的 password 字段格式通常是:
pbkdf2_sha256$720000$RANDOM_SALT$BASE64_HASH
你可以直接查看 分隔符后面的第一个数字,那就是迭代次数。
如果你的系统仍在使用旧算法,建议这样做
- 升级 Django 版本(至少到 5.0+)。
- 更新
settings.py中的PASSWORD_HASHERS:- 将
Argon2PasswordHasher放在最前面(如果你需要最高安全性)。 - 或者至少确保
PBKDF2PasswordHasher在列表中。
- 将
- 等待用户登录:旧哈希会在用户登录时自动升级,无需手动干预。
- 清理剩余旧哈希:对于长期不活跃的用户,可以考虑在后台脚本中手动调用
check_password()触发升级,或者设置密码过期策略。
- 是的,Django 密码哈希算法一直在升级,主要体现在 PBKDF2 的迭代次数不断增加(72 万次)。
- 更具破坏性的变化是引入了 Argon2 和 bcrypt 作为可选算法,它们能更好地抵御硬件加速破解。
- 你无需手动迁移数据,Django 的登录过程会自动将旧哈希升级为新算法或更高轮次。
如果你有具体的旧算法(MD5、SHA1 或非常低轮次的 PBKDF2),建议尽快升级 Django 版本并设置合理的 PASSWORD_HASHERS 顺序。