python - 为什么不可用的密码在 Django 的用户身份验证中具有随机字符串?

标签 python django

当我阅读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/

相关文章:

python - mod_wsgi : Reload Code via Inotify - not every N seconds

python - Django 。模板在本地工作但不在 pythonanywhere.com 上工作

python - 没有名为 '_ctypes' 的模块

python - “cd”命令不适用于 fabric3

python - 如何通过字典或JSON等似是而非的格式将三个列表合并为一个列表? Python

python - Django ORM 获取字段的最大值和对应的其他列值

python - 如何用Python和Java来做云计算?最后一年项目

python - if comment.name == user 无法正常工作

javascript - Django:在脚本中使用上下文变量

python - 来自 APE 服务器模块的 POST 请求出现问题