【问题标题】:Django - check if two password hashes are of same raw passwordDjango - 检查两个密码哈希是否具有相同的原始密码
【发布时间】:2020-03-11 12:58:56
【问题描述】:

我想跟踪用户密码更改历史记录,如果他们以前使用过他们的当前密码,则显示警告。需要注意的是,如果之前使用过,我不想阻止用户设置密码,我想让他们设置密码,但之后只显示警告。所以我要找的不是密码验证器。

我知道,虽然 Django 将用户密码保存在数据库中,但它会使用随机盐创建密码的哈希值。因此,相同密码的 2 个哈希值不会相同。不过,是否可以判断是否使用与输入相同的原始密码创建了 2 个不同的密码哈希?

【问题讨论】:

  • 为此,您需要原始(未散列的)密码;然后,您可以使用与旧密码相同的随机盐对其进行哈希处理,并查看哈希是否匹配。如果你只有哈希,这是不可能的。
  • @deceze 是的,就我而言,我所拥有的只是哈希值。如果您可以发布一个答案来解释这是不可能的,我可以接受。

标签: django cryptography django-users


【解决方案1】:

如果您无法访问明文密码并且您所拥有的只是哈希值,则您无法在它们之间进行任何比较。这正是为了使密码不可逆,尤其是它们的整个数据库。如果有足够的时间和计算能力,您也许可以暴力破解一个密码,但您不能将该知识应用于任何其他哈希,因此暴力破解它们的整个数据库非常昂贵。

可以在注册、登录或密码重置时进行此类比较,此时用户输入了他们的普通密码。此时,您只需将密码与现有密码的盐值进行哈希处理,然后比较哈希值。

【讨论】:

    【解决方案2】:

    我不知道,我理解你的情况是否正确。 这是基于我从您的问题中理解的解决方案。 您可以使用与 Django 中的 User 模型相关联的 check_password() 方法将新密码与已使用的密码进行比较。

     @api_view(['POST'])
     def some_function(request):
        new_password = request.data.get('password')
        # get the user from the request
        user_object = request.user
        if user_object.check_password(new_password):
           # check_password() will hash the new_password in the same way how it hashed the password which is already stored in the db and it will compare the new_password with that password.
           print("Both the passwords are same")
        else:
           print("Passwords are not same")
    

    如果请求未通过身份验证,则无法从请求中获取用户。在这种情况下,此代码将不起作用。

    希望它能解决您的问题。

    【讨论】:

    • 当我想进行比较时,我无法访问原始密码。在我的情况下,我只有 2 个不同的密码哈希,并且想知道这些哈希是否是使用相同的原始密码创建的
    • 查看此链接。它可以帮助你stackoverflow.com/questions/21031661/…
    • 谢谢,虽然不是同一种情况,但它提供了一些想法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2023-03-15
    • 2019-04-07
    • 2011-01-04
    • 2020-04-27
    • 2011-06-20
    相关资源
    最近更新 更多