2013-08-16 32 views
7

Tôi cần tạo hàng trăm (có thể là hàng nghìn) người dùng theo chương trình ở Django. Tôi đang sử dụng một cái gì đó như:Django make_password quá chậm để tạo danh sách lớn người dùng theo chương trình

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() 

Quá trình này mất quá nhiều thời gian để thực thi. Tôi đã xác nhận rằng make_password là thủ phạm bằng cách chạy tập lệnh trên mà không cần mật khẩu.

Có vấn đề gì liên quan đến sự chậm chạp này, tôi thực sự cần tập lệnh này để thực thi nhanh chóng.

+0

Bạn có thể chuyển một muối và thuật toán băm của riêng bạn vào 'make_password' như được ghi lại [ở đây] (https://docs.djangoproject.com/en/dev/topics/auth/passwords/#django.contrib.auth. hashers.make_password). –

Trả lời

14

Bạn có thể sử dụng django.contrib.auth.hashers.MD5PasswordHasher để có mật khẩu ban đầu. Theo Django docs on how Django stores passwords,

Theo mặc định, Django sử dụng thuật toán PBKDF2 với một băm SHA256, căng cơ chế mật khẩu khuyến cáo của NIST. Điều này phải là đủ cho hầu hết người dùng: nó khá an toàn, yêu cầu số lượng lớn thời gian tính toán để phá vỡ .

[...]

Django chọn một thuật toán bằng cách tham khảo ý kiến ​​PASSWORD_HASHERS thiết lập. Đây là danh sách các lớp thuật toán băm mà hỗ trợ cài đặt Django này. Các mục đầu tiên trong danh sách này (nghĩa là, settings.PASSWORD_HASHERS [0]) sẽ được sử dụng [theo mặc định] để lưu trữ mật khẩu, và tất cả các mục khác hashers hợp lệ mà có thể được sử dụng để kiểm tra hiện mật khẩu. [...]

Giá trị mặc định cho PASSWORD_HASHERS là:

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

Do đó bạn muốn giữ mặc định như hiện nay, nhưng sử dụng một hasher yếu ở phần đầu; đảm bảo rằng MD5PasswordHasher có trong danh sách. Sau đó, sử dụng

make_password(pwd, None, 'md5') 

để tạo mật khẩu MD5 muối đồng bằng ban đầu; điều này sẽ không quá yếu nếu mật khẩu ban đầu là đủ ngẫu nhiên. Khi người dùng thay đổi mật khẩu của họ, mật khẩu của họ sẽ được mã hóa bằng thuật toán mạnh hơn.

+0

hoạt động như một sự quyến rũ, cảm ơn. –

+1

Ý tưởng hay! Nhưng ** chỉ ** nếu mật khẩu ban đầu bạn cung cấp cho họ thực sự là một mật khẩu thực sự tốt - ví dụ: một chuỗi ASCII 12 ký tự hoàn toàn ngẫu nhiên. – nealmcb

Các vấn đề liên quan