Python 将旧密码散列存储在Django中,这样用户就可以';不要重复使用相同的密码

Python 将旧密码散列存储在Django中,这样用户就可以';不要重复使用相同的密码,python,django,hash,passwords,Python,Django,Hash,Passwords,有没有办法在Django中存储旧密码散列,这样用户就不能重复使用相同的密码 在研究这个问题时,每次Django创建密码哈希时,哈希都是不同的,即使密码是相同的。例如,这将返回两个不同的哈希: from django.contrib.auth.hashers import make_password make_password('foo') make_password('foo') 我能理解这其中的安全原因。在Django有人试过这样做吗?以某种方式存储旧密码,以便用户在密码过期时必须使用新密码

有没有办法在Django中存储旧密码散列,这样用户就不能重复使用相同的密码

在研究这个问题时,每次Django创建密码哈希时,哈希都是不同的,即使密码是相同的。例如,这将返回两个不同的哈希:

from django.contrib.auth.hashers import make_password
make_password('foo')
make_password('foo')
我能理解这其中的安全原因。在Django有人试过这样做吗?以某种方式存储旧密码,以便用户在密码过期时必须使用新密码,等等……?

使用

make_password("foo",salt="bar")

但是存储历史哈希确实很烦人…

不确定是否仍然与您相关,但其他人肯定会相关。
您可以存储所有以前的散列,然后将每个散列与Django执行的相同函数进行比较:

from django.contrib.auth.hashers import check_password
check_password("plain_password", "hash_stored")
最好的办法是按照Django在文档末尾的建议,将此检查添加到自定义密码验证中

大概是这样的:

class InvalidPasswordReused:
    number_of_passw_not_allowed = settings.PASSWORDS_HASH_STORED

    def __init__(self, number_of_prev_passw_not_allowed=6):
        self.number_of_prev_passw_not_allowed = number_of_prev_passw_not_allowed
        pass

    def validate(self, password, user=None):
        if user.previous_passwords:
            previous_passwords = list(user.previous_passwords)
            for prev_passw in previous_passwords:
                if check_password(password, prev_passw):
                    raise ValidationError(
                        f"Password cannot be one of the {self.number_of_prev_passw_not_allowed} last passwords.",
                        code='passwor_reused_not_allowed'
                    )
        return None

    def get_help_text(self):
        return f"Password cannot be one of the {self.number_of_prev_passw_not_allowed} last passwords."

不管怎么说,发生这种情况的原因是它在设置密码时使用了salt。我确信在设置中,每次都可以指定一个恒定的salt,而不是一个新的salt…@Aaron,你找到办法了吗?甚至我也计划实施存储。。请让我知道,如果你找到了任何解决方案相同。