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