Python Django:make_password输出与Django.auth不同的密码

Python Django:make_password输出与Django.auth不同的密码,python,django,passwords,password-encryption,Python,Django,Passwords,Password Encryption,我正在尝试实现一个用户密码历史记录,以便用户在更新密码时不能使用相同的密码两次。 我正在为此使用Django auth模块 为了实现这一点,我只需将用户创建的新密码保存在另一个sql表中my_userpasswordhistory 之后,我创建了一个新的PasswordValidator来对照旧密码检查新密码。 我打算这样做的方式是,从数据库中的用户处获取所有旧密码,分离salt,然后运行make\u password(newpassword,salt) 请参阅以下代码: pass_li

我正在尝试实现一个用户密码历史记录,以便用户在更新密码时不能使用相同的密码两次。 我正在为此使用Django auth模块

为了实现这一点,我只需将用户创建的新密码保存在另一个sql表中
my_userpasswordhistory

之后,我创建了一个新的PasswordValidator来对照旧密码检查新密码。 我打算这样做的方式是,从数据库中的用户处获取所有旧密码,分离
salt
,然后运行
make\u 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\u password()
创建的密码不同

数据库中“我的密码”的值为:

从my_userpasswordhistory中选择密码
pbkdf2_sha256$36000$trlHVdErn23Z$BAxX9p3o54QGovIWluP3dM7q73HQNZy9VuYOA6rv268=

但是,使用salt
trlHVdErn23Z
在一个相同的原始密码上,我得到:

pbkdf2\u sha256$36000$trlHVdErn23Z$6WbA/0FUVDI82GJN7LQJDMOADIOGYOJ3A913CUGFBY=

此外,多次运行
make_password()
将始终输出相同的(第二个)密码哈希

我不知道Django在管理面板中创建密码时是否使用了一些额外的随机发生器,是否发现了bug,或者更可能的是,我遗漏了什么


非常感谢。

您应该使用
检查密码
,而不是
生成密码

检查密码(密码,编码)

如果要通过比较数据库中的明文密码和散列密码来手动验证用户,请使用便利函数check_password()。它需要两个参数:要检查的纯文本密码和要检查的数据库中用户密码字段的完整值,如果匹配则返回True,否则返回False


我有点担心
make_password
,它使用随机salt在HMAC上迭代大约100毫秒,并使用散列保存salt。最好使用函数,如
PBKDF2
Rfc2898DeriveBytes
password\u hash
Bcrypt
passlib.hash
或类似函数。重点是让攻击者花费大量时间通过暴力手段查找密码。注意:NIST目前建议不要让密码过期。对于我们使用电脑的旧方法来说,这是一个古老的想法。今天,除非有妥协的迹象,否则不要让人们更改密码。请参阅:我同意NIST的成功,但客户需要此功能。由于这是“功能”,只有在登录或丢失密码后才能访问,我不认为它与暴力有什么关系。(如果攻击者登录,则为时已晚,向该脚本添加安全性不会起任何作用)这不会起作用,因为哈希对于所有过去的密码都是不同的。如果只有一个密码,那么您建议的方法会起作用,但我需要能够根据一系列旧密码验证新密码。