我正在尝试实现用户密码历史记录,以便用户在更新密码时不能使用相同的密码两次。 我正在使用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=
但是,在identic原始密码上使用salt trlHVdErn23Z
,我得到:
pbkdf2_sha256$36000$trlHVdErn23Z$6WbA/0fUvDi82GjN7lqjdMoaDiaoojGY3A913CGuFBY=
此外,多次运行make_password()
将始终输出相同的(第二个)密码哈希值。
我无法弄清楚Django是否在管理面板中创建密码时使用了一些额外的随机函数,如果我发现了一个错误,或者更有可能,我错过了一些东西。
提前多多感谢。
答案 0 :(得分:1)
您应该使用check_password
代替make_password
。
check_password(密码,已编码)
如果您想通过将纯文本密码与数据库中的散列密码进行比较来手动验证用户身份,请使用便捷功能check_password()。它需要两个参数:要检查的纯文本密码,以及要检查的数据库中用户密码字段的完整值,如果匹配则返回True,否则返回False。