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

aki*_*524 2 python django

当我读取django.contrib.auth代码时,我发现了这段代码django.contrib.auth.hassers.make_password.

UNUSABLE_PASSWORD_PREFIX + get_random_string(UNUSABLE_PASSWORD_SUFFIX_LENGTH)
Run Code Online (Sandbox Code Playgroud)

但是,我不明白为什么不能使用不可用的密码UNUSABLE_PASSWORD_PREFIX,这是'!' .

有这个代码,在django.contrib.auth.hassers.is_password_usable.

if encoded is None or encoded.startswith(UNUSABLE_PASSWORD_PREFIX):
    return False
Run Code Online (Sandbox Code Playgroud)

我认为随机字符串是没有意义的.

knb*_*nbk 5

密码哈希用于生成密码重置令牌.通过降低复杂性,它可以将重置令牌打开为暴力攻击.攻击者必须拥有SECRET_KEY这个才能工作.

要生成密码重置令牌,请使用用户的ID,日期last_login,密码哈希和SECRET_KEY[1].对于超级用户来说,ID很可能1并且last_login日期是在网站上线的几周内,即超级用户从未登录过,这是帐户的创建日期.

如果SECRET_KEY已知,则ID非常可猜测并且密码哈希是已知的,攻击者只需要猜测日期时间,即几周内的时间.使用秒的分辨率(last_login设置为0 的微秒部分),每周留下大约600K可能的值.有了时间和耐心,这个值可以强制执行,攻击者可以为超级用户或管理员帐户设置一个新的可用密码.

在这次攻击中有相当多的"if",但它是一种可能的攻击向量.不可用密码中的随机哈希增加了密码重置令牌对不可用密码的熵,并消除了这种攻击.

[1] https://github.com/django/django/blob/master/django/contrib/auth/tokens.py#L66