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

为何Django中PASSWORD_HASHERS配置为列表而非单个字符串?

Django中PASSWORD_HASHERS为列表格式的设计目的与实际作用

为什么采用列表格式而非单个字符串?

Django的密码存储格式会自带当前使用的哈希算法标识,本身就支持多算法同时存在的场景,用列表而非单个值的核心设计目的是解决哈希算法迭代、历史数据兼容的问题,避免算法升级时需要全量修改用户密码数据。

列表的优先级规则非常明确:

  • 列表第一个元素是当前系统默认使用的哈希算法,所有新注册用户、密码更新的用户都会用这个算法生成哈希值
  • 后续的元素是系统允许兼容的其他哈希算法,仅用于校验存量的旧密码

配置多组密码哈希算法的实际作用

  • 无缝升级哈希算法:当你需要把当前使用的哈希算法替换为更安全的版本(比如从PBKDF2升级为Argon2),只需要把新算法放到列表首位,旧算法保留在后续位置即可。用户登录时Django会先识别旧密码的算法标识,用对应算法校验通过后,自动在后台用新的算法重新计算哈希值并覆盖存储,整个过程用户完全无感知,不需要任何额外操作。
  • 兼容多来源的存量密码:如果你的项目是从旧版本Django迁移、或者从其他开发框架迁移过来,只需要把历史上用过的所有哈希算法按优先级加入列表,所有老用户的密码都可以正常校验,不需要批量重置所有用户密码,大幅降低迁移的用户影响面。
  • 灵活应对安全风险:如果当前在用的哈希算法被曝出安全漏洞,你可以第一时间把更安全的算法调整到列表首位,旧算法先保留在列表中保证用户可以正常登录,等所有用户都完成至少一次登录、密码都被自动升级为新算法哈希之后,再把旧算法从列表中移除即可,不需要紧急停服做全量数据迁移。
  • 逐步提升哈希强度:哪怕是同一种哈希算法,你也可以配置不同的参数(比如PBKDF2的迭代次数)放到列表中,逐步提升密码哈希的破解难度,不需要强制用户修改密码就可以完成全量用户的密码强度升级。

举个典型的配置示例:

PASSWORD_HASHERS = [
    # 新密码默认用Argon2算法
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    # 兼容旧版本的PBKDF2算法密码
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 00:45:06