将旧的密码哈希存储在Django中,因此用户无法重复使用相同的密码

问题描述 投票:3回答:2

是否有一种方法可以在Django中存储旧的密码哈希,因此用户无法重复使用相同的密码?

[在对此进行研究时,每次Django创建密码哈希时,即使密码相同,哈希也不同。例如,这将返回两个不同的哈希值:

from django.contrib.auth.hashers import make_password
make_password('foo')
make_password('foo')

我可以理解其安全原因。有没有人尝试在Django中做到这一点?要以某种方式存储旧密码,因此用户在密码过期时将不得不使用新密码,等等...?

python django hash passwords
2个回答
2
投票

使用

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

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


0
投票

不确定是否仍然与您相关,但肯定会与其他人相关。您可以存储所有先前的哈希,然后将每个哈希与Django所做的相同功能进行比较:

from django.contrib.auth.hashers import check_password
check_password("plain_password", "hash_stored")

最好的想法是按照Django在文档https://docs.djangoproject.com/en/2.0/topics/auth/passwords/结尾中的建议,将此检查添加到自定义密码验证中>>

类似这样的东西:

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."
© www.soinside.com 2019 - 2024. All rights reserved.