当我读取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)
我认为随机字符串是没有意义的.
密码哈希用于生成密码重置令牌.通过降低复杂性,它可以将重置令牌打开为暴力攻击.攻击者必须拥有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