【发布时间】:2020-10-07 19:25:31
【问题描述】:
我想通过密码获取用户,所以当我输入以下代码时
User.objects.get(password='test')
我收到一个错误,我已经知道什么是错误,因为密码已经过哈希处理,但我想得到它,那么我需要什么技巧?
【问题讨论】:
-
你没有。哈希是随机的,所以你不能这样做。即使您因此有 a 哈希作为密码,您也无法使用它进行过滤。
标签: django password-hash
我想通过密码获取用户,所以当我输入以下代码时
User.objects.get(password='test')
我收到一个错误,我已经知道什么是错误,因为密码已经过哈希处理,但我想得到它,那么我需要什么技巧?
【问题讨论】:
标签: django password-hash
我收到一个错误,我已经知道什么是错误,因为密码已经过哈希处理,但我想得到它,那么我需要什么技巧?
你没有。散列算法使用与散列密码一起存储的 random 值(命名为salt [wiki])。因此,这意味着对于给定的密码,没有单个哈希值,而是无限个数。对于固定的盐大小,严格来说,哈希结果的数量是有限的,但哈希的数量仍然很大,无法生成/测试所有结果。
Salt 用于防止一组预先计算的哈希值(也称为rainbow table [wiki])。通过使用盐,几乎不可能为给定的一组密码计算每个可能的盐的哈希值,从而使将哈希值反转为密码的问题变得更加困难。
因此,您应该遍历User 对象,并使用.check_password(…) method [Django-doc]:
for user in User.objects.all():
if user.check_password('test'):
# … we found a user with password 'test'
pass
有关详细信息,请参阅How Django stores passwords section of the documentation。
【讨论】:
email 获取User 对象,它可以很快地做到这一点,然后然后,在检索到 User 对象后,它将在 Django/Python 级别调用 check_password。这将查看散列密码,获取最后一个,使用给定的盐重新散列,然后检查散列是否匹配。但查找部分是通过电子邮件或其他标识符(username、id 等)完成的