问题描述
User.objects.get(password='test')
我得到一个错误,并且我已经知道在说什么错误了,因为密码已经被散列了,但是我想得到它,所以我需要什么技巧?
解决方法
我得到一个错误,并且我已经知道在说什么错误了,因为密码已经被散列了,但是我想得到它,所以我需要什么技巧?
您不。哈希算法利用与哈希密码一起存储的 random 值(名为salt [wiki])。因此,这意味着对于给定的密码,没有单个哈希,而是无限个。对于固定的盐大小,严格来说,哈希结果的数量是有限的,但是哈希的数量仍然很大,以至于无法生成/测试所有哈希值。
盐用于防止出现一组预先计算的哈希值(也称为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。