当我阅读django.contrib.auth
代码时,我在django.contrib.auth.hassers.make_password
中找到了这段代码。
UNUSABLE_PASSWORD_PREFIX + get_random_string(UNUSABLE_PASSWORD_SUFFIX_LENGTH)
但是,我不明白为什么不可用的密码不仅是UNUSABLE_PASSWORD_PREFIX
,而是'!'。
有这段代码,在django.contrib.auth.hassers.is_password_usable
中。
if encoded is None or encoded.startswith(UNUSABLE_PASSWORD_PREFIX):
return False
我认为随机字符串没有意义。
最佳答案
密码哈希用于生成密码重置 token 。通过降低复杂性,它向暴力攻击开放了重置 token 。攻击者必须拥有 SECRET_KEY
才能正常工作。
要生成密码重置 token ,需要使用用户 ID、last_login
中的日期、密码哈希和 SECRET_KEY
[1]。对于 super 用户,ID 很可能是 1
并且 last_login
日期在网站上线后的几周内,即 super 用户从未登录过并且这是帐户的创建日期。
如果 SECRET_KEY
是已知的,那么 ID 就很容易被猜到并且密码散列是已知的,攻击者只需要猜测日期时间,它在几周的时间跨度内。使用一秒的分辨率(last_login
的微秒部分设置为 0),每周留下大约 600K 可能的值。随着时间和耐心,这个值可以被暴力破解,攻击者可以为 super 用户或管理员帐户设置一个新的可用密码。
这次攻击中有很多“如果”,但它是一个可能的攻击向量。不可用密码中的随机散列增加了不可用密码的密码重置 token 的熵,并消除了这种攻击。
[1] https://github.com/django/django/blob/master/django/contrib/auth/tokens.py#L66
关于python - 为什么不可用的密码在 Django 的用户身份验证中具有随机字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32496537/