如何在Django中获取密码?

5

我有一个Python库,是为了其他用途编写的。所以我将其导入Django中使用,但我面临的问题是如何获取密码。

mycustom_lib_function(username, password)

username可以通过request.user传递。

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

4个回答

16

User 中的密码已经被哈希加密,因此您无法获得它。请询问用户。


谢谢。你是说用户必须手动输入密码吗?我查看了“User”API,不太确定如何获取它。 - user1012451
我所说的就是我所写的。 - Ignacio Vazquez-Abrams
谢谢。但我不能一直要求输入密码。这个函数用于某些点击事件。所以让他们在每个请求之前输入密码100次再单击,相当...疯狂。 - user1012451

6
您可以将密码存储为明文,但从安全角度来看,这并不正确,请参见此答案,强烈不建议这样做!django.contrib.auth.hashers提供了一些很好的工具用于处理密码,请参见Django官方文档
如果您知道明文密码可能是什么,例如在我的应用程序中有一个全局存储的默认密码,以明文形式存储,如下面的示例。要检查用户是否将其密码设置为默认密码,请使用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函数。

5

你的函数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解密这个密码吗?谢谢。 - user1012451
好的,我设计了这个库。所以现在我接受明文的用户名和密码,就像你观察到的那样。但是我不认为我可以传入哈希值到那些远程仓库来进行身份验证。 - user1012451
@anotheruser 是的,你不能通过django来“解密”一个哈希密码。(哈希是一个单向函数,不是真正的加密)。当用户创建一个账户时,你可以将用户的密码以明文形式保存在数据库中。请参考:https://dev59.com/_XVD5IYBdhLWcg3wO5AD。你应该向用户明确表示你正在以明文形式存储他们的密码。另一种可能性是,在你的应用程序中跟踪具有权限的用户,并为用户`django`在git/hg仓库中创建一个账户,以代表用户执行操作。 - dr jimbob
感谢jimbob。我们同意在某些时候需要支持OAUth和OpenID。目前我们只是扩展了User类,添加一个小的自定义函数,该函数返回登录信息(传入request.user,检查是否有权限调用我们的自定义库,如果有,则提供全局凭证)。谢谢。 - user1012451
这已经不再是真的了。在Django 4中,密码由4个字段组成 - <algorithm>$<iterations>$<salt>$<hash>,未来这种情况可能会改变。使用'check_password' Django函数要好得多。 - Guildenstern70

1

您无法获取用户的密码,但可以检查给定值是否为正确的密码。

from django.contrib.auth.hashers import check_password
user = User.objects.get(id = user_id) #get the correct user using mail or id
if check_password('my_old_password',user.password):
   #update the password here

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Ersain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接