我目前正在使用 Django 在 Python 中开发一个工具,我必须在其中导入现有的用户数据库。显然,这些现有用户的密码与 Django 使用的默认密码加密不同。
我想覆盖密码方法的加密以保持我的密码不被修改。我没有找到如何在文档中覆盖现有方法,只是找到了如何添加有关用户的信息(我也没有找到如何删除有关用户的信息 - 例如名字或姓氏 - 所以如果有人知道,请告诉请告诉我)。
感谢您的帮助。
我目前正在使用 Django 在 Python 中开发一个工具,我必须在其中导入现有的用户数据库。显然,这些现有用户的密码与 Django 使用的默认密码加密不同。
我想覆盖密码方法的加密以保持我的密码不被修改。我没有找到如何在文档中覆盖现有方法,只是找到了如何添加有关用户的信息(我也没有找到如何删除有关用户的信息 - 例如名字或姓氏 - 所以如果有人知道,请告诉请告诉我)。
感谢您的帮助。
在 Django 中,用户身份验证的方式不是在 User 模型本身中完成的。Django 使用其他模块来做到这一点。在您的情况下,您可以创建自定义模块来检查密码并将其添加到您的settings.py
(文档)中。
关于 Django 的一件很酷的事情是,您可以提供多个这些哈希器来执行该身份验证。假设您当前的哈希方法不如 Django 使用的某些方法安全。然后,如果您将自定义哈希添加到 的底部PASSWORD_HASHERS
,可能会发生以下情况。如果尝试登录的用户密码是使用您的自定义方法存储的,那么 Django 将尝试第一个哈希器,它会失败。然后它将尝试其余的哈希,除了您的自定义哈希之外,它们都将失败。但是,由于用户已成功通过身份验证,并且成功的散列器不是第一个散列器,因此 Django 将使用第一个定义的散列器自动重新散列密码。这样,您可以在用户继续登录时优雅地升级到更安全的密码哈希算法。
此外,如果您正在迁移当前数据库并且 users 表与 Django 用户模型不匹配,请记住,从 Django 1.5 开始,您可以定义自定义User
模型而不是 Django 的。
重新考虑您关于保留旧密码哈希的决定。
除非你已经为它们使用了一些非常现代和强大的方案(如 pbkdf2、bcrypt.shaXXX_crypt)——而不仅仅是一些(盐渍或非盐渍的)sha1-hash。
我知道保持兼容并支持旧废话是很诱人的,但是这些旧的(加盐或不加盐,对于暴力破解并不重要)现在可以以> 1 * 10 ^ 9的速率破坏每秒猜测。
此外,由于同样的原因,旧密码的最小长度要求可能需要重新考虑。
默认的 django 密码哈希方案是一个非常安全的方案,顺便说一句,你真的应该使用它。