10

我需要在 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 是罪魁祸首。

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

4

1 回答 1

17

您可以使用django.contrib.auth.hashers.MD5PasswordHasher初始密码。根据关于 Django 如何存储密码的 Django 文档

默认情况下,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 密码;如果初始密码足够随机,这不会太弱。随着用户更改密码,他们的密码将使用更强大的算法进行加密。

于 2013-08-16T12:17:58.527 回答