<分区> 分区>
我正在尝试实现用户密码历史记录,以便用户在更新密码时不能使用相同的密码两次。 为此,我正在使用 Django 身份验证模块。
为了实现这一点,我只是将用户创建的新密码保存在一个额外的 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() 创建的密码不同。
我的密码在数据库中的值为:
从 my_userpasswordhistory 中选择密码; pbkdf2_sha256$36000$trlHVdErn23Z$BAxX9p3o54QGovIWluP3dM7q73HQNZy9VuYOA6rv268=
但是,在相同的原始密码上使用盐 trlHVdErn23Z,我得到:
pbkdf2_sha256$36000$trlHVdErn23Z$6WbA/0fUvDi82GjN7lqjdMoaDiaoojGY3A913CGuFBY=
此外,多次运行 make_password() 将始终输出相同的(第二个)密码哈希值。
我无法确定 Django 在管理面板中创建密码时是否使用了一些额外的随机化器,如果我发现了错误,或者更可能是我遗漏了什么。
非常感谢。
