Django密码哈希算法升级了吗

wen python案例 2

本文目录导读:

Django密码哈希算法升级了吗

  1. 当前主流版本(Django 4.x / 5.x)的默认哈希配置
  2. 新增的算法支持(超越 PBKDF2)
  3. 升级的幕后机制:自动升级
  4. 如何检查你项目的算法状态?
  5. 如果你的系统仍在使用旧算法,建议这样做

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

你可以直接查看 分隔符后面的第一个数字,那就是迭代次数。

如果你的系统仍在使用旧算法,建议这样做

  1. 升级 Django 版本(至少到 5.0+)。
  2. 更新 settings.py 中的 PASSWORD_HASHERS
    • Argon2PasswordHasher 放在最前面(如果你需要最高安全性)。
    • 或者至少确保 PBKDF2PasswordHasher 在列表中。
  3. 等待用户登录:旧哈希会在用户登录时自动升级,无需手动干预。
  4. 清理剩余旧哈希:对于长期不活跃的用户,可以考虑在后台脚本中手动调用 check_password() 触发升级,或者设置密码过期策略。
  • 是的,Django 密码哈希算法一直在升级,主要体现在 PBKDF2 的迭代次数不断增加(72 万次)。
  • 更具破坏性的变化是引入了 Argon2bcrypt 作为可选算法,它们能更好地抵御硬件加速破解。
  • 你无需手动迁移数据,Django 的登录过程会自动将旧哈希升级为新算法或更高轮次。

如果你有具体的旧算法(MD5、SHA1 或非常低轮次的 PBKDF2),建议尽快升级 Django 版本并设置合理的 PASSWORD_HASHERS 顺序。

抱歉,评论功能暂时关闭!