【发布时间】:2018-08-12 16:54:33
【问题描述】:
我已经从 Discourse 导出了数据库。它确实包含密码哈希和盐。
我做了研究,发现Django默认使用PBKDF2,甚至Discours use that with hashing algorithm sha256 and number of iterations 64000。
我想迁移这些密码,以便 Django 能够验证具有相同密码的用户。
【问题讨论】:
我已经从 Discourse 导出了数据库。它确实包含密码哈希和盐。
我做了研究,发现Django默认使用PBKDF2,甚至Discours use that with hashing algorithm sha256 and number of iterations 64000。
我想迁移这些密码,以便 Django 能够验证具有相同密码的用户。
【问题讨论】:
有很多方法可以做到这一点。
在后端编写您自己的身份验证方法 - 当用户尝试登录时,它接受与 Discourse 相同的哈希方法。这样,哈希密码应该与用户的盐和他们输入的密码相匹配。
这可以按如下方式完成:
from django.contrib.auth.hashers import PBKDF2PasswordHasher
class MyPBKDF2PasswordHasher(PBKDF2PasswordHasher):
"""
A subclass of PBKDF2PasswordHasher that uses 64000 times more iterations.
"""
iterations = PBKDF2PasswordHasher.iterations * n
iterations = 64000 #Use this for simplicity!!
在hashers.py。请注意 - PBKDF2PasswordHasher.iterations * n 必须等于 64000 - 我认为迭代次数当前设置为 150000,因此直接使用 iterations = 64000 可能更容易。迭代就是您要更改的所有内容,所有其他行为都将从PBKDF2PasswordHasher 类继承。
那么,你只需要:
PASSWORD_HASHERS = [
'application_name.hashers.MyPBKDF2PasswordHasher',
]
在settings.py 中,application_name 是,你猜对了,可以在其中找到hashers.py 的应用程序的名称。
但是...以下有关密码存储和散列的文档可能对您的搜索非常有用:
https://docs.djangoproject.com/en/2.1/topics/auth/passwords/#auth-password-storage
【讨论】: