在 Django 中存储旧密码哈希值,因此用户不能重复使用相同的密码
Store old password hashes in Django, so Users can't reuse the same password
有没有办法在 Django 中存储旧密码哈希值,这样用户就不能重复使用相同的密码?
在对此进行研究时,每次 Django 创建密码散列时,散列都是不同的,即使密码相同。例如,这将 return 两个不同的哈希值:
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 在文档 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."
有没有办法在 Django 中存储旧密码哈希值,这样用户就不能重复使用相同的密码?
在对此进行研究时,每次 Django 创建密码散列时,散列都是不同的,即使密码相同。例如,这将 return 两个不同的哈希值:
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 在文档 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."