【问题标题】:how could I get the password hash in Django ORM?如何在 Django ORM 中获取密码哈希?
【发布时间】:2020-10-07 19:25:31
【问题描述】:

我想通过密码获取用户,所以当我输入以下代码时

User.objects.get(password='test') 

我收到一个错误,我已经知道什么是错误,因为密码已经过哈希处理,但我想得到它,那么我需要什么技巧?

【问题讨论】:

  • 你没有。哈希是随机的,所以你不能这样做。即使您因此有 a 哈希作为密码,您也无法使用它进行过滤。

标签: django password-hash


【解决方案1】:

我收到一个错误,我已经知道什么是错误,因为密码已经过哈希处理,但我想得到它,那么我需要什么技巧?

没有。散列算法使用与散列密码一起存储的 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

【讨论】:

  • 好的,但我试图理解 Django 中的 authenticate(email=email, password=password) 方法,所以我得到的最接近的例子是当我输入 User.objects.get(email=' example@gmail.com', id=1) 在这种情况下,如果正确,我可以通过该方法登录,那么如何替换身份验证方法并执行类似于我键入的 ORM 的操作,但此时将由密码代替身份证?
  • @abdelhamedab​​din:它将使用给定的email 获取User 对象,它可以很快地做到这一点,然后然后,在检索到 User 对象后,它将在 Django/Python 级别调用 check_password。这将查看散列密码,获取最后一个,使用给定的盐重新散列,然后检查散列是否匹配。但查找部分是通过电子邮件或其他标识符(usernameid 等)完成的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2015-03-20
  • 2013-03-04
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多