Skip to main content
 首页 » 编程设计

python之Django:make_password 输出与 django.auth 不同的密码

2025年01月19日30webabcd

<分区>

我正在尝试实现用户密码历史记录,以便用户在更新密码时不能使用相同的密码两次。 为此,我正在使用 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 在管理面板中创建密码时是否使用了一些额外的随机化器,如果我发现了错误,或者更可能是我遗漏了什么。

非常感谢。