【问题标题】:How do I get the password in django?如何在 django 中获取密码?
【发布时间】:2012-03-23 05:14:50
【问题描述】:

我有一个 python 库,我为其他东西编写了它。所以我导入它以在 Django 中使用,我面临的问题是如何获取密码。

mycustom_lib_function(username, password)

username我可以通过request.user进入

但是,我不确定如何获取密码。有人能帮我吗?谢谢。

【问题讨论】:

    标签: django


    【解决方案1】:

    User 中的密码是经过哈希处理的,因此您无法获取它。询问用户。

    【讨论】:

    • 谢谢。你是说用户必须手动输入密码?我查看了User API,不太确定如何通过。
    • 我的意思就是我写的。
    • 谢谢。但我不能一直要求密码。该函数用于一些点击事件。因此,让他们在点击之前为 100 个请求中的每一个输入 100 次密码是相当……疯狂的。
    【解决方案2】:

    从技术上讲,您可以将密码存储为纯文本,但从安全角度来看这是不对的,请参阅this answer,强烈不推荐! django.contrib.auth.hashers 有一些很好的密码工具,请参阅the official Django docs

    如果您知道纯文本密码可能是什么,即我的一个应用程序中有一个全局存储的默认密码,该密码以纯文本形式存储,如下例所示。要检查用户的密码是否设置为默认密码,您可以使用 check_password 函数,如果纯文本与编码密码匹配,该函数将返回 True:

    from django.contrib.auth.hashers import check_password
    from django.contrib.auth.models import User
    u = User.objects.all().first()
    if check_password('the default password', u.password):
        print 'user password matches default password'
    else:
        print 'user a set custom password'
    

    另请参阅 is_password_usable 和 make_password 函数。

    【讨论】:

      【解决方案3】:

      您的函数mycustom_lib_function 不应使用明文密码。在用户通过您的应用程序进行身份验证后,您将拥有一个包含哈希密码的 User 对象(来自 django.contrib.auth.models):

      >>> user.username
      u'myusername'
      >>> user.password
      u'sha1$98ffc$b5fd085b8bc1c05fd241dfc97230631926141fe7'
      

      输入表单的实际密码不会以明文形式存储,因为标准网络安全建议您不要在身份验证后存储明文密码值。
      请注意,您可以通过执行以下操作来检查上述哈希:

      >>> from hashlib import sha1
      >>> password = 'weak_password'
      >>> _, salt, hashpw = user.password.split('$')
      >>> sha1(salt+password).hexdigest() == hashpw
      True
      

      现在,如果您的应用程序包含在您无法控制的另一个应用程序中,该应用程序需要密码才能执行某些操作,您可以考虑以明文形式存储其密码(或稍微更好地对其进行加密),但django.contrib.auth 不会这样做为你。如果您设置一个 OAuth 类型的凭据系统会更好,该系统完全可以执行此功能,而无需用户向中间站点透露他们的密码。

      如果它是您控制的应用程序,我会放弃将密码传递给它的要求。

      【讨论】:

      • 我无法控制它。该库用于远程存储库控制(hg、git),因此需要用户名和密码才能调用它。这与django登录基本相同)。因此,请考虑一个执行“克隆存储库”的功能。该函数接受 url、用户名、密码和克隆到本地磁盘。是的。该函数接受明文密码。所以我们不能通过Django来解密这个密码吗?谢谢
      • 好吧,我设计了这个库。所以现在我使用用户名和密码,正如你所观察到的那样,它们是纯文本的。但我认为我不能将哈希传递到那些远程存储库中进行身份验证。
      • @anotheruser 是的,你不能通过 django '解密'散列密码。 (散列是一种单向函数,不是真正的加密)。当他们创建用户帐户时,您可以将用户的密码以明文形式保存在数据库中。请参阅:stackoverflow.com/questions/44109/… 您应该让用户非常清楚您正在以明文形式存储他们的密码。另一种可能性是您跟踪谁在您的应用程序中拥有权限,并在 git/hg 存储库中为用户 django 创建一个帐户,该帐户为用户执行操作。
      • 谢谢jimbob。我们同意在某些时候我们将不得不支持 OAUth 和 OpenID。目前我们只是扩展了 User 类,带有一个小的自定义函数,它返回登录信息(传入 request.user,检查它是否有权调用我们的自定义库,如果是,则提供全局凭据) .谢谢。
      • 这不再是真的了。在 Django 4 中,密码由 4 个字段组成 - $$$,没有什么可以阻止将来再次更改。使用 'check_password' Django 函数会更好。
      猜你喜欢
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 2018-12-26
      • 2015-02-27
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      相关资源
      最近更新 更多