Django make_password太慢,无法以编程方式创建大型用户列表

时间:2013-08-16 12:13:49

标签: python django django-models

我需要在Django中以编程方式创建数百个(可能是数千个)用户。我使用的是:

from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password
for username, email, pwd in big_user_list:
    m = User(username=username, email=email, password=make_password(pwd))
    m.save()

执行时间太长。我已经确认make_password是运行上面没有密码的脚本的罪魁祸首。

无论如何,这个慢速问题,我真的需要这个脚本快速执行。

1 个答案:

答案 0 :(得分:15)

您可以使用django.contrib.auth.hashers.MD5PasswordHasher作为初始密码。根据{{​​3}},

  

默认情况下,Django使用带有SHA256哈希的PBKDF2算法,   NIST推荐的密码拉伸机制。这应该是   足以满足大多数用户:它非常安全,需要大量用户   计算破坏时间。

     

[...]

     

Django通过咨询PASSWORD_HASHERS来选择算法   设置。这是这个Django的散列算法类列表   安装支持。 此列表中的第一个条目(即,   settings.PASSWORD_HASHERS [0]) [默认] 用于存储密码,所有   其他条目是可用于检查现有的有效哈希   密码。 [...]

     

PASSWORD_HASHERS的默认值为:

PASSWORD_HASHERS = (
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
    'django.contrib.auth.hashers.SHA1PasswordHasher',
    'django.contrib.auth.hashers.MD5PasswordHasher',
    'django.contrib.auth.hashers.CryptPasswordHasher'
)

因此,您希望保持现在的默认值,但在开头使用较弱的哈希;确保列表中存在MD5PasswordHasher。然后使用

make_password(pwd, None, 'md5')

最初生成普通的盐渍MD5密码;如果初始密码足够随机,这不会太弱。当用户更改密码时,他们的密码将使用更强大的算法进行加密。