Django 从1.4 版本开始,包含了一些安全方面的重要提升。其中一个是使用 PBKDF2 密码加密算法代替了 SHA1 。另外一个特性是你可以添加自己的密码加密方法。
Django 会使用你提供的第一个密码加密方法(在你的 setting.py 文件里要至少有一个方法)
1 2 3 4 5 6 7 8 | PASSWORD_HASHERS = ( 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', 'django.contrib.auth.hashers.BCryptPasswordHasher', 'django.contrib.auth.hashers.SHA1PasswordHasher', # Insecure Hashes 'django.contrib.auth.hashers.MD5PasswordHasher', # Insecure Hashes 'django.contrib.auth.hashers.CryptPasswordHasher', # Insecure Hashes ) |
---|
但Django默认生成的密码策略往往会带上 md5_xxx, pbkdf2_xxx,同其他系统整合的时候,一般是没有这些前缀的,这就需要我们自定义一个密码策略。
下面介绍下如何定义一个简单的 md5(md5(password, salt))
密码策略。
建立一个app,django-admin.py startapp ownmd5
在 ownmd5中 建立 hashers.py 文件,加入 OwnMd5PasswordHasher 类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import hashlib from django.utils.translation import ugettext_noop as _ from django.utils.datastructures import SortedDict from django.utils.crypto import constant_time_compare from django.utils.encoding import force_bytes, force_str, force_text from django.contrib.auth.hashers import BasePasswordHasher, mask_hash class OwnMD5PasswordHasher(BasePasswordHasher): """ The Salted MD5 password hashing algorithm (not recommended) """ algorithm = "ownmd5" def encode(self, password, salt): assert password is not None assert salt and '$' not in salt hash = hashlib.md5(hashlib.md5(force_bytes(salt + password)).hexdigest()).hexdigest() return hash def verify(self, password, encoded, salt): encoded_2 = self.encode(password, salt) return constant_time_compare(encoded, encoded_2) def safe_summary(self, encoded, salt): return SortedDict([ (_('algorithm'), self.algorithm), (_('salt'), mask_hash(salt, show=4)), (_('hash'), mask_hash(hash)), ]) |
---|
将 OwnMD5PasswordHasher 加入到settings.py 中:
1 2 3 | PASSWORD_HASHERS = ( 'ownmd5.hashers.OwnMD5PasswordHasher', ) |
---|
这样,默认的user及auth模块都会采用自定义的md5算法。
参考:
https://docs.djangoproject.com/en/1.6/topics/auth/passwords/