为何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
相关产品推荐
相关产品推荐

