如何在没有User对象的情况下存储Django哈希密码?

Saq*_*Ali 5 passwords django

我有一个Django应用程序,允许Web访问者创建自己的帐户.一旦他们使用密码创建帐户,他们就会收到包含激活码的电子邮件.当网络访问者创建新帐户时,他们需要接收包含唯一密钥的激活电子邮件.

显然,我可以使用Django的内置身份验证系统完成所有这些工作.我以前做过没有任何问题.但是,在此应用程序中,我不想使用非活动用户污染我的Users表.我只希望激活的用户出现在Users表中.因此,虽然我将使用Django的帐户系统来验证激活的用户,但是在它们被激活之前,我正在使用我自己的系统.我将所有关于尚未激活的用户的数据保存在一个单独的Django Model对象中(称为UserActivation).我将自己管理激活电子邮件的发送.

我遇到的问题是我不想将用户提交的密码存储在纯文本中.我想将它存储在我的UserActivation对象中的一个名为"password"的字段中,其格式与User表中显示的格式相同.把它放到用户对象中,我会做的myUser.set_password("plainTextPassword").我怎样才能获得相同的价值并将其融入其中UserActivation.password

从查看文档,似乎有一个make_password()函数返回我需要的值.但我仍然需要一个User对象来调用该方法.如何"plainTextPassword"在不通过User对象的情况下转换为哈希密码?

Nit*_*ora 17

你走在正确的轨道上.但是,您可以使用手动管理密码

from django.contrib.auth.hashers import make_password
print "Hashed password is:", make_password("plain_text")
Run Code Online (Sandbox Code Playgroud)

Hasher配置将由PASSWORD_HASHERS驱动,这对于auth系统和UserActivation模型都应该是通用的.但是你也可以在make_password方法中传递它.

PASSWORD_HASHERS = (
    'myproject.hashers.MyPBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
    'django.contrib.auth.hashers.SHA1PasswordHasher',
    'django.contrib.auth.hashers.MD5PasswordHasher',
    'django.contrib.auth.hashers.CryptPasswordHasher',
)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

请阅读此链接以获取更多详细信息:https: //docs.djangoproject.com/en/dev/topics/auth/passwords/


MIk*_*kee 13

接受的答案对我有帮助 - 我只是想添加check_password调用(对于像我这样的人,之前没有使用过这个功能)

from django.contrib.auth.hashers import make_password, check_password

hashed_pwd = make_password("plain_text")
check_password("plain_text",hashed_pwd)  # returns True
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的一点是,即使 pw 为 None,make_password 也会返回一个字符串(尽管对内置登录无效)。内置登录检查它是否以 UNUSABLE_PASSWORD_PREFIX 常量开头。 (2认同)