使用mongoengine中的md5进行密码哈希

时间:2016-02-13 04:35:03

标签: mongodb authentication django-models passwords mongoengine

我在django中使用 mongoengine(MongoDb ORM)。我想验证用户,他的密码应该以散列值存储。 Plz帮助我,因为mongoengine没有给任何PasswordField()来存储密码。

我可以验证用户logi n的任何其他选项。

1 个答案:

答案 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')