2013-03-31 150 views
1

我目前正在使用Django在Python中开发一个工具,在该工具中我必须导入现有的用户数据库。显然,这些现有用户的密码与Django使用的默认密码加密不同。Django覆盖密码加密

我想覆盖密码方法的密码以保持我的密码不被修改。我没有找到如何覆盖文档中的现有方法,只是发现如何添加有关用户的信息(我没有找到如何删除信息 - 如名字或姓氏 - 关于用户,所以如果有人知道,告诉我请)。

谢谢你的帮助。

+0

请查阅https://docs.djangoproject.com/en/1.5/topics/auth/passwords/ for Django 1.5; https://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwords Django 1.4。您需要提供一个自定义的哈希器并在设置中对其进行配置。 – okm

回答

2

在Django中,用户身份验证的方式不是在用户模型本身中完成的。 Django使用其他模块来做到这一点。在你的情况下,你可以创建自定义模块来检查密码并将其添加到settings.pydocs)中。

Django的一个很酷的事情是,你可以提供多个哈希来做这个验证。假设你的当前散列方法并不像Django使用的一些方法那么安全。然后,如果您将自定义筛选器添加到PASSWORD_HASHERS的底部,则可能会发生以下情况。如果试图登录的用户密码是使用自定义方法存储的,那么Django会尝试第一个hasher,它会失败。然后它会尝试其余的哈希,除了定制的哈希以外,它们都会失败。但是,由于用户被成功验证,并且由于成功的哈希器不是第一个哈希器,Django将使用第一个定义的哈希器自动重新哈希密码。这样,当用户不断登录时,您可以优雅地升级到更安全的密码散列算法。

另外,如果您要迁移当前数据库并且用户表与Django用户模型不匹配,请记住,使用Django 1.5,您可以定义自定义的User模型,而不是Django的模型。

+0

谢谢你,这是完美的! :-) –

0

重新考虑您关于保留旧密码哈希值的决定。

除了你已经使用了一些非常现代和强大的方案(如pbkdf2,bcrypt,shaXXX_crypt) - 而不仅仅是一些(腌制或不腌制)sha1-hash。

我知道它只是保持兼容并支持旧垃圾,但这些旧的(腌过的或无盐的,对蛮力无关紧要)sha1-hashes现在可以被打破,速率大于1 * 10^9每秒猜测。

此外,由于相同的原因,旧密码最小长度要求可能需要重新考虑。

默认的django密码哈希方案是一个非常安全的,顺便说一句,你应该真的使用它。