2014-02-06 65 views
2

我有一个遗留用户数据库,我想集成到一个新的Django项目中。简单的MD5哈希可以转换为django密码吗?

密码用简单明了的MD5加密(MD5 PHP()函数)保存在旧数据库的用户,不用任何腌制。

重写check_password和django.contrib.auth的set_password是不是一种选择,因为我已经有了新的Django项目活动的新用户。

看着passlib,但不幸的是它不会做什么是需要要在这一具体项目来完成。因此基本上,我唯一的选择是将哈希以某种方式转换为Django salted格式,或实现自定义的check_password方法,该方法将确定密码是纯MD5还是django密码(甚至可能通过我的参数自定义用户模型,类似legacy=True布尔标志)。

任何帮助,非常感谢。

+0

“将哈希以某种方式转换为Django腌制格式” - 这应该是不可能的。第二个选项听起来很对。 – amsh

+0

我知道,MD5被认为是单向加密,但也许有人很好的彩虹表的知道:d –

+0

它实际上可以工作,只是我不太热衷于做这样的操作,以django.contrib.auth –

回答

7

Django的contrib.auth.hashers module已经支持纯,无盐MD5密码:

# Ancient versions of Django created plain MD5 passwords and accepted 
# MD5 passwords with an empty salt. 
if ((len(encoded) == 32 and '$' not in encoded) or 
     (len(encoded) == 37 and encoded.startswith('md5$$'))): 
    algorithm = 'unsalted_md5' 

因此,如果您散列长度32(散列的十六进制表示) ,并且不包含$字符(这表明存在散列签名前缀),哈希长37个字符,并与md5$$然后开始你的哈希值是已经支持

更好的是:任何成功进行身份验证的用户都会将其密码哈希自动更新为当前的首选方案。您的用户将自己迁移您的数据库。

+0

这是超级酷,在文档中的任何参考? –

+0

我不这么认为;这是处理遗留设置的代码,文档没有真正解决这个问题。请参阅https://code.djangoproject。com/ticket/18144的票证,可以让您很好地了解Django支持的内容。 –

+0

划痕;是的,当用户成功登录并且密码使用过时格式散列时,密码会升级到当前首选的散列方案。您的用户将被自动迁移。 –

1

在这些情况下,我建议你采取不同的方法。

1)创建您自己的身份验证后端。

2)在后端实现相同的密码验证系统,即您的PHP项目。

3)比较后端的哈希密码,就像django身份验证后端一样。

4)认证成功后,设置Django的方法的用户密码,因此,它会使用默认的Django认证逻辑。 。

5)登录用户在