在 Django 1.5 之前,Django 对于用户密码的加密方式一直是 SHA1,存在数据库的样例如下:
sha1
1bb66
f6c9b132a39287884997412ec7b6c8a543c79a06
但在 Django 1.5 之后,密码的加密方式默认改为了 PBKDF2 算法与 SHA256 哈希值,存在数据库的样例如下:
pbkdf2_sha256
10000
RQPpfjqHFLPp$YJ70H2ZCCkgqs27I4yP0bx5L7Ve7pnHvNDKJVFhINsw=
很明显,下面的密码比上面的多了一个字段(迭代次数:10000),如果用户通过 Djang 1.5 登录,数据库中的密码会变成最新的加密方式(未验证,是通过发生的现象猜测的)。
处于某种特殊的原因,我们需要 1.2 版本和 1.5 版本共存,如果用户通过 1.5 登录后密码改变,再通过 1.2 登录,就会报 too many values to unpack ,查看报错信息不难发现是 django 1.2 通过 “$” 对新加密的密码做分隔所至,所以就需要更改 Django 1.5 的加密方式,使用户不论通过那个版本登录,密码的格式都是相同的。
尽管 Django 官方文档给出了如何更改加密方式,但由于 Django 建议非必要最好不要随意更改,一定要改只能借助 py-bcrypt 库,更改步骤如下:
1. 安装 py-bcrypt 库
2. 在settings.py 中添加
PASSWORD_HASHERS = (
'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',
)
官方文档:https://docs.djangoproject.com/en/1.5/topics/auth/passwords/