Parcourir la source

Factor password hashing

Baptiste Jonglez il y a 11 ans
Parent
commit
85a0dbc816
2 fichiers modifiés avec 22 ajouts et 6 suppressions
  1. 2 6
      coin/members/models.py
  2. 20 0
      coin/utils.py

+ 2 - 6
coin/members/models.py

@@ -16,6 +16,7 @@ from ldapdb.models.fields import CharField, IntegerField, ListField
 from south.modelsinspector import add_ignored_fields
 from south.modelsinspector import add_ignored_fields
 from coin.offers.models import OfferSubscription
 from coin.offers.models import OfferSubscription
 from coin.models import CoinLdapSyncModel
 from coin.models import CoinLdapSyncModel
+from coin import utils
 from django.contrib.auth.signals import user_logged_in
 from django.contrib.auth.signals import user_logged_in
 from django.conf import settings
 from django.conf import settings
 
 
@@ -275,12 +276,7 @@ def change_password(sender, instance, **kwargs):
     avant la sauvegarde pour chiffrer le mot de passe s'il est définit
     avant la sauvegarde pour chiffrer le mot de passe s'il est définit
     et s'il n'est pas déjà chiffré
     et s'il n'est pas déjà chiffré
     """
     """
-    # Si le mot de passe est définit et n'est pas déjà chiffré,
-    # alors ça le chiffre
-    if instance.password and not instance.password.startswith('{SSHA}'):
-        salt = os.urandom(8).encode('hex')
-        digest = hashlib.sha1(instance.password + salt).digest()
-        instance.password = '{SSHA}' + base64.b64encode(digest + salt)
+    instance.password = utils.ldap_hash(instance.password)
 
 
 
 
 @receiver(pre_save, sender=LdapUser)
 @receiver(pre_save, sender=LdapUser)

+ 20 - 0
coin/utils.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+import os
+import hashlib
+import binascii
+import base64
+
+
+def ldap_hash(password):
+    """Hash a password for use with LDAP.  If the password is already hashed,
+    do nothing."""
+    if password and not password.startswith('{SSHA}'):
+        salt = binascii.hexlify(os.urandom(8))
+        digest = hashlib.sha1(password.encode() + salt).digest()
+        return '{SSHA}' + base64.b64encode(digest + salt).decode()
+    else:
+        return password
+
+
+if __name__ == '__main__':
+    print(ldap_hash('coin'))