Django 覆盖密码加密

3

我目前正在使用Django开发Python工具,需要导入现有的用户数据库。很明显,这些现有用户的密码与Django使用的默认密码加密不同。

我想要覆盖密码方法的加密方式,以保持我的密码不变。我在文档中没有找到如何覆盖现有方法的信息,只找到了如何添加有关用户的信息(如果有人知道如何删除有关用户的信息,例如名字或姓氏,请告诉我)。

谢谢你的帮助。


请查看以下链接以获取有关 Django 1.5 的信息:https://docs.djangoproject.com/en/1.5/topics/auth/passwords/;有关 Django 1.4 的信息,请参考 https://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwords。您需要提供一个自定义的哈希函数并在设置中进行配置。 - okm
2个回答

4
在Django中,用户的身份验证并不是在User模型本身中完成的。Django使用其他模块来完成这个过程。在您的情况下,您可以创建自己的模块来检查密码,并将其添加到您的settings.py中(文档)。
Django的一个很酷的功能是,您可以提供多个哈希函数来进行身份验证。假设您当前的哈希方法不如Django使用的某些方法安全。然后,如果您将自定义哈希器添加到PASSWORD_HASHERS的底部,则会发生以下情况。如果尝试登录的用户的密码是使用您的自定义方法存储的,则Django将尝试第一个哈希器,但会失败。然后它将尝试其余的哈希,它们都会失败,除了您的自定义哈希器。但是,由于用户已经成功验证,并且成功的哈希器不是第一个哈希器,因此Django将自动使用第一个定义的哈希器重新对密码进行哈希。通过这种方式,您可以在用户继续登录时优雅地升级为更安全的哈希算法。
另外,如果您正在迁移当前数据库,并且用户表与Django用户模型不匹配,请记住,从Django 1.5开始,您可以定义自己的自定义User模型,而不是使用Django的模型。

1
请重新考虑保留您旧的密码哈希值的决定,除非您已经使用了一些非常现代和强大的方案(如pbkdf2、bcrypt、shaXXX_crypt),而不仅仅是一些(有盐或无盐的)sha1-hash。
我知道只是保持兼容性和支持旧的东西很诱人,但这些旧的(有盐或无盐的,对于暴力破解来说没有太大区别)sha1-hash现在可以以每秒超过1*10^9次的速度被破解。
另外,由于同样的原因,可能需要重新考虑旧密码的最小长度要求。
顺便说一下,默认的Django密码哈希方案非常安全,您真的应该使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接