如何在Django中使用bcrypt哈希密码匹配CakePHP生成的加密结果
Django兼容CakePHP bcrypt密码方案
前置说明
CakePHP的blowfish哈希就是标准bcrypt算法,setCost(7)对应bcrypt的成本因子为7,哈希迭代次数为2^7=128次。bcrypt生成的哈希字符串本身包含成本因子、salt等参数,校验时会自动读取这些参数,不需要额外适配即可完成旧密码校验。
操作步骤
1. 安装依赖
安装bcrypt库支持:pip install bcrypt
2. 基础配置(仅校验旧密码用)
修改项目settings.py中的PASSWORD_HASHERS配置,将bcrypt哈希器放在列表首位即可:
PASSWORD_HASHERS = [ "django.contrib.auth.hashers.BCryptPasswordHasher", # 保留原来的其他哈希器即可 "django.contrib.auth.hashers.PBKDF2PasswordHasher", "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher", "django.contrib.auth.hashers.Argon2PasswordHasher", ]
完成以上配置后,直接调用Django自带的check_password(用户输入的明文密码, 数据库存储的旧哈希)方法即可完成原有密码的校验。
3. 进阶配置(新生成密码和原CakePHP规则一致)
如果需要新创建的用户、用户修改后的密码也采用成本因子7的bcrypt哈希,和原有CakePHP生成规则完全一致,可以自定义哈希器:
- 在你的Django应用下新建
hashers.py文件,写入以下内容:
from django.contrib.auth.hashers import BCryptPasswordHasher class CakeBCryptHasher(BCryptPasswordHasher): # 对应CakePHP setCost(7),迭代次数为2的7次方 rounds = 1 << 7
- 修改
settings.py中的PASSWORD_HASHERS,将自定义哈希器放在首位:
PASSWORD_HASHERS = [ "你的应用名.hashers.CakeBCryptHasher", # 其他原有哈希器保持不变 "django.contrib.auth.hashers.BCryptPasswordHasher", "django.contrib.auth.hashers.PBKDF2PasswordHasher", ]
校验测试
可以用原有系统的明文密码和对应哈希做测试:
from django.contrib.auth import check_password # 第一个参数是用户输入的明文密码,第二个参数是数据库里存的CakePHP生成的哈希 print(check_password("你的测试明文密码", "对应CakePHP生成的哈希字符串")) # 返回True即为校验成功
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

