Comment utiliser Bcrypt pour chiffrer les mots de passe en Django

j'essaie d'utiliser Bcrypt pour chiffrer les mots de passe que les utilisateurs fournissent lors de l'enregistrement et puis utiliser Bcrypt pour valider un mot de passe qu'un utilisateur fournit lors de la connexion contre la version hachée stockée dans la base de données.

il y a une assez bonne documentation sur la façon d'installer Bcrypt sur via le Django docs , mais ils ne vous montrent pas réellement comment utiliser Bcrypt pour hachage des mots de passe ou utiliser d'autres commandes.

avez-vous besoin d' pour importer Brcrypt de quelque part? Si oui, quelle est la bonne syntaxe? Quelle est la syntaxe pour Hasher les mots de passe et comparer les mots de passe hashés avec les mots de passe non-hashés?

j'ai installé la bibliothèque Bcrypted dans le settings.py fichier et aussi installé Bcrypt via pip. Que dois-je faire d'autre pour utiliser Bcrypt?

6
demandé sur Erik Åsland 2015-11-25 05:43:53

2 réponses

à votre lien:

l'attribut de mot de passe de un objet utilisateur est une chaîne de caractères dans ce format:

<algorithm>$<iterations>$<salt>$<hash> ce sont les composants utilisés pour stocker le mot de passe D'un utilisateur , séparé par le caractère dollar-signe et se composent de: l'algorithme de hachage, le nombre de l'algorithme itérations (facteur de travail), le sel aléatoire, et le mot de passe résultant hachage. L'algorithme est l'un d'un certain nombre de hachage unidirectionnel ou mot de passe les algorithmes de stockage que Django peut utiliser; voir ci-dessous. Les itérations décrivent nombre de fois que l'algorithme est exécuté sur le hachage. Le sel est le hasard les semences utilisées et le hachage est le résultat d'une fonction.


j'ai installé la bibliothèque Bcrypted dans le settings.py file... Que dois-je faire d'autre pour utiliser Bcrypt?

Je ne sais pas ce que signifie cette première phrase. Vous devez mettre ce qui suit dans 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',
)

utiliser Bcrypt pour valider un mot de passe qu'un utilisateur fournit lors de la connexion contre la version hachée stockée dans la base de données.

vous pouvez le faire manuellement:

le django.contrib.auth.le module hashers fournit un ensemble de fonctions de créer et valider le mot de passe hashé. Vous pouvez les utiliser indépendamment à partir du modèle Utilisateur.

check_password(mot de passe codé)

Si vous souhaitez authentifier manuellement un utilisateur en comparant un mot de passe en texte clair à la hachée mot de passe dans la base de données, utilisez la fonction convenience check_password (). Il faut deux arguments: le mot de passe en clair à vérifier, et la pleine valeur du champ Mot de passe d'un utilisateur dans la base de données à vérifier, et renvoie True si elles correspondent, False sinon.

https://docs.djangoproject.com/en/1.9/topics/auth/passwords/#module-django.contrib.auth.hashers

ou, vous pouvez utiliser authenticate() :

authentifier (**lettres de créance)

Pour authentifier un nom d'utilisateur et mot de passe, utilisez authentifier.)( Elle prend la forme de lettres de créance les arguments de mot-clé, pour la configuration par défaut c'est le nom d'utilisateur et mot de passe, et il renvoie un objet utilisateur si le mot de passe est valide pour le nom d'utilisateur donné. Si le mot de passe n'est pas valide, authenticate () retourne Aucun. Exemple:

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

voici quelques exemples:

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

ce sont les valeurs par défaut: il n'y a pas d'entrée dans mon settings.py pour PASSWORD_HASHERS .

>>> from django.contrib.auth.models import User

>>> my_user = User.objects.create_user('ea87', 'ea@gmail.com', '666monkeysAndDogs777')

>>> my_user.save()
>>> my_user.password
'pbkdf2_sha256000$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()

ensuite, j'ai ajouté ce qui suit: 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')

notez les hashers bcrypt à l'avant du tuple.

>>> from django.contrib.auth.models import User

>>> user = User.objects.get(username='ea87')
>>> user
<User: ea87>

>>> user.password
'pbkdf2_sha256000$DS20ZOCWTBFN$AFfzg3iC24Pkj5UtEu3O+J8KOVBQvaLVx43D0Wsr4PY='

>>> user.set_password('666monkeysAndDogs777')
>>> user.password
'bcrypt_sha256$b$QeWvpi7hQ8cPQBF0LzD4C.89R81AV4PxK0kjVXG73fkLoQxYBundW'

vous pouvez voir que le mot de passe a changé pour une version bcrypt.

8
répondu 7stud 2015-11-25 11:23:34

courte version de la réponse de 7stud

Sur le Django de 1,9 modèle par défaut projet de l'utilisation de create_user :

User.objects.create_user(username='uname', password='mypass')

au lieu de create , qui ne hachera pas le mot de passe.

une autre option est de définir le mot de passe avec:

user = User(username='uname')
user.set_password('mypass')
user.save()

enfin, vous pouvez aussi utiliser des chaînes comme mentionné à: comment chiffrer rapidement une chaîne de mots de passe dans Django sans modèle D'utilisateur?

1