我在django中使用 mongoengine(MongoDb ORM)。我想验证用户,他的密码应该以散列值存储。 Plz帮助我,因为mongoengine没有给任何PasswordField()来存储密码。
我可以验证用户logi n的任何其他选项。
答案 0 :(得分:1)
Django内置了两个非常有用的密码散列算法。
请参阅docs.djangoproject.com,其中说明了
默认情况下,Django使用带有SHA256哈希的PBKDF2算法
和
Bcrypt是一种流行的密码存储算法,专门用于长期密码存储。这不是Django使用的默认值,因为它需要使用第三方库,但由于许多人可能想要使用它,Django只需要很少的工作就支持bcrypt。
如果你使用足够多的迭代/工作因子,这两个中的任何一个都是优秀的;不要使用任何其他选项。 django通过以上链接轻松实现这一点:
PBKDF2和bcrypt算法使用多次迭代或轮次散列。这故意减慢了攻击者的速度,使得针对哈希密码的攻击变得更加困难。然而,随着计算能力的增加,需要增加迭代次数。我们选择了一个合理的默认值(并且会在每次发布Django时增加它),但是你可能希望将其调整起来
因此,在新应用程序的设置文件中,您可以使用新的子类增加工作因子:
来自django.contrib.auth.hashers导入PBKDF2PasswordHasher
class MyPBKDF2PasswordHasher(PBKDF2PasswordHasher):
"""
A subclass of PBKDF2PasswordHasher that uses 100 times more iterations.
"""
iterations = PBKDF2PasswordHasher.iterations * 100
然后将您的变体放入设置文件中,同时允许读取旧的PBKDF2-HMAC-SHA-256和BCryptSHA256哈希:
PASSWORD_HASHERS = [
'myproject.hashers.MyPBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
]
还设置了一些密码验证:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 9,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
根据存储的密码验证输入的密码(如在登录页面上):
check_password(password, encoded)
要生成新密码条目(例如从注册页面选择或更改密码):
make_password(password, salt=None, hasher='default')