Al vostro link:
L'attributo la password di un oggetto utente è una stringa in questo formato:
<algorithm>$<iterations>$<salt>$<hash>
Questi sono i componenti utilizzati per memorizzare la password di un utente , separato dal carattere del simbolo del dollaro e composto da: l'algoritmo di hashing, il numero di algoritmi iterazioni (fattore lavoro), t ha salt saltato, e l'hash della password risultante . L'algoritmo è uno di un numero di hashing a una via o password algoritmi di archiviazione che Django può usare; vedi sotto. Le iterazioni descrivono il numero di volte che l'algoritmo viene eseguito tramite l'hash. Salt è il seme casuale utilizzato e l'hash è il risultato della funzione unidirezionale.
ho installato la libreria Bcrypted nel file settings.py ... Che altro devo fare per utilizzare Bcrypt?
Non sono sicuro di cosa significhi quella prima frase. Hai bisogno di mettere quanto segue in settings.py
:
PASSWORD_HASHERS = (
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher',
'django.contrib.auth.hashers.CryptPasswordHasher',
)
uso Bcrypt per convalidare una password di un utente fornisce al login contro la versione hash memorizzato nel database.
È possibile farlo manualmente:
Il modulo django.contrib.auth.hashers fornisce una serie di funzioni per creare e convalidare la password hash. È possibile utilizzarli indipendentemente dal modello Utente.
check_password (password, codificata)
Se vuoi per autenticare manualmente un utente confrontando una password di testo normale alla hash password nel database, utilizzare la funzione di convenienza check_password().Sono necessari due argomenti: la password in chiaro al controllo e il valore completo del campo della password di un utente nel database da verificare e restituisce True se corrispondono, False altrimenti.
https://docs.djangoproject.com/en/1.9/topics/auth/passwords/#module-django.contrib.auth.hashers
In alternativa, è possibile utilizzare authenticate()
:
autenticazione (**) le credenziali
per autenticare il nome utente e la password, l'uso authenticate(). Accetta credenziali sotto forma di argomenti di parole chiave , per la configurazione di default è il nome utente e la password e restituisce un oggetto Utente se la password è valida per il nome utente specificato. Se la password non è valida, authenticate() restituisce Nessuno. Esempio:
from django.contrib.auth import authenticate
user = authenticate(username='john', password='password to check')
if user is not None:
# the password verified for the user
if user.is_active:
print("User is valid, active and authenticated")
else:
print("The password is valid, but the account has been disabled!")
else:
# the authentication system was unable to verify the username and password
print("The username and password were incorrect.")
https://docs.djangoproject.com/en/1.9/topics/auth/default/#authenticating-users
Ecco alcuni esempi:
(django186p34)~/django_projects/dj1$ python manage.py shell
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.conf import settings
>>> print(settings.PASSWORD_HASHERS)
('django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher',
'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher',
'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher',
'django.contrib.auth.hashers.CryptPasswordHasher')
Queste sono le impostazioni di default: non v'è alcuna voce nella mia settings.py per PASSWORD_HASHERS
.
>>> from django.contrib.auth.models import User
>>> my_user = User.objects.create_user('ea87', '[email protected]', '666monkeysAndDogs777')
>>> my_user.save()
>>> my_user.password
'pbkdf2_sha256$20000$L7uq6goI1HIl$RYqywMgPywhhku/YqIxWKbpxODBeczfLm5zthHjNSSk='
>>> my_user.username
'ea87'
>>> from django.contrib.auth import authenticate
>>> authenticate(username='ea87', password='666monkeysAndDogs777')
<User: ea87>
>>> print(authenticate(username='ea87', password='wrong password'))
None
>>> from django.contrib.auth.hashers import check_password
>>> check_password('666monkeysAndDogs777', my_user.password)
True
>>> exit()
Successivamente, ho aggiunto il seguente al settings.py:
PASSWORD_HASHERS = (
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher',
'django.contrib.auth.hashers.CryptPasswordHasher',
)
(django186p34)~/django_projects/dj1$ python manage.py shell
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.conf import settings
>>> print(settings.PASSWORD_HASHERS)
('django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher',
'django.contrib.auth.hashers.CryptPasswordHasher')
Nota le hashers bcrypt nella parte anteriore della tupla.
>>> from django.contrib.auth.models import User
>>> user = User.objects.get(username='ea87')
>>> user
<User: ea87>
>>> user.password
'pbkdf2_sha256$20000$DS20ZOCWTBFN$AFfzg3iC24Pkj5UtEu3O+J8KOVBQvaLVx43D0Wsr4PY='
>>> user.set_password('666monkeysAndDogs777')
>>> user.password
'bcrypt_sha256$$2b$12$QeWvpi7hQ8cPQBF0LzD4C.89R81AV4PxK0kjVXG73fkLoQxYBundW'
Si può vedere che la password è stata modificata in una versione di bcrypt.
I upvoted, perché un sacco di idee mi ha aiutato a scoprire che cosa mi ha confuso; mettere in corto per quelli confusi in futuro: gli hash prodotti da BCrypt (che è ciò che php attualmente utilizza) non sono affatto nella forma ' $ $ $ ' come indicato nella documentazione, ma come potete vedere a la fine della risposta (solo con "_sha256", almeno questo è il modo in cui i miei hash php sono stati crittografati -> importati in django! :)) –
Ilja