2013-08-16 12 views
7

Potrzebuję stworzyć setki (ewentualnie tysiące) użytkowników programowo w Django. Używam czegoś podobnego:Django make_password zbyt wolno do tworzenia dużej listy użytkowników programowo

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

Trwa to zbyt długo, aby wykonać. Potwierdziłem, że make_password jest winowajcą, uruchamiając powyższy skrypt bez haseł.

Czy jest tak wokół tego problemu powolności, naprawdę potrzebuję tego skryptu do szybkiego wykonania.

+0

Możesz przekazać sól i swój własny algorytm mieszający do 'make_password', jak to udokumentowano [tutaj] (https://docs.djangoproject.com/en/dev/topics/auth/passwords/#django.contrib.auth. hashers.make_password). –

Odpowiedz

14

Możesz użyć django.contrib.auth.hashers.MD5PasswordHasher dla początkowego hasła. Zgodnie Django docs on how Django stores passwords,

Domyślnie, Django używa algorytmu PBKDF2 z mieszania SHA256, z hasłem rozciągającej mechanizmem zalecanym przez NIST. Powinno to być wystarczające dla większości użytkowników: jest całkiem bezpieczne, wymagające ogromnych ilości czasu obliczania do zerwania.

[...]

Django wybiera algorytm przez konsultacji z PASSWORD_HASHERS ustawienia. Jest to lista klas algorytmów skrótu obsługiwanych przez tę instalację Django . Pierwszy wpis na tej liście (czyli settings.PASSWORD_HASHERS [0]) zostaną wykorzystane [domyślnie] do przechowywania haseł i wszystkie inne wpisy są ważne hashers, które mogą być stosowane w celu sprawdzenia istniejących hasła. [...]

Domyślną PASSWORD_HASHERS jest:

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

ten sposób, że chcesz zachować domyślne, jak to jest teraz, ale używać słabszego hasher na początku; upewnij się, że numer MD5PasswordHasher znajduje się na liście. Następnie należy najpierw wygenerować zwykłe hasło MD5 w postaci zwykłego komunikatu MD5; nie będzie to zbyt słaby, pod warunkiem, że początkowe hasło jest wystarczająco losowe. Gdy użytkownicy zmieniają swoje hasła, ich hasła będą szyfrowane za pomocą silniejszego algorytmu.

+0

działa jak urok, dzięki. –

+1

Dobry pomysł! Ale ** tylko ** jeśli podane hasło początkowe jest naprawdę dobre - np. całkowicie losowy 12-znakowy łańcuch ASCII. – nealmcb

Powiązane problemy