我正在尝试实现一个用户密码历史记录,这样用户在更新密码时就不能两次使用相同的密码。为此,我使用Django auth模块。
为了实现这一点,我只需将用户创建的新密码保存在一个额外的sql表my_userpasswordhistory
中。
之后,我创建了一个新的PasswordValidator来检查新密码和旧密码。我打算这样做的方式是,从数据库中的用户那里获取所有旧密码,拆分salt
并运行make_password(newpassword, salt)
。
请参阅以下代码:
pass_list = UserPasswordHistory.objects.all().filter(user=user)
for old_pass in pass_list:
#split password so we get the hash and the salt
split_pass = old_pass.password.split('$')
salt = split_pass[2]
pw = split_pass[-1]
if make_password(password, salt) == old_pass.password:
raise ValidationError(
_('Your new Password needs to be different from your old one!'),
code='password_identic'
)
问题
我遇到的问题是,Django在管理后端(通过接口)生成的密码与我使用make_password()
创建的密码不同。
数据库中我的密码值为:
select password from my_userpasswordhistory;
pbkdf2_sha256$36000$trlHVdErn23Z$BAxX9p3o54QGovIWluP3dM7q73HQNZy9VuYOA6rv268=
然而,在一个身份原始密码上使用salttrlHVdErn23Z
,我得到:
pbkdf2_sha256$36000$trlHVdErn23Z$6WbA/0fUvDi82GjN7lqjdMoaDiaoojGY3A913CGuFBY=
此外,多次运行make_password()
将始终输出相同的(第二个)密码哈希。
我不知道Django在管理面板中创建密码时是否使用了一些额外的随机发生器,如果我发现了一个错误,或者更可能的是,我错过了一些东西。
提前非常感谢。
您应该使用check_password
而不是make_password
。
来自django文档
check_password(密码,编码)
如果您想通过将明文密码与数据库中的哈希密码进行比较来手动验证用户,请使用方便函数check_password()。它需要两个参数:要检查的纯文本密码和要检查的数据库中用户密码字段的完整值,如果匹配则返回True,否则返回False。