Browse Source

Factor password hashing

Baptiste Jonglez 11 years ago
parent
commit
85a0dbc816
2 changed files with 22 additions and 6 deletions
  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 coin.offers.models import OfferSubscription
 from coin.models import CoinLdapSyncModel
+from coin import utils
 from django.contrib.auth.signals import user_logged_in
 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
     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)

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