我正在将网站从Drupal 7迁移到Django 1.4,包括当前用户。如何使用Drupal散列的密码?
根据this的说法,Drupal 7使用SHA-512哈希密码(它们以“$ S $”开头的字符串形式存储)。
Django 1.4现在包含许多用于存储密码的options,默认值为SHA-256,但是我找不到SHA-512的选项。虽然this app似乎允许使用SHA2算法,但我不确定它是否与Django 1.4兼容(因为1.4具有灵活的密码哈希器)。
最简单的方法是什么?
ETA:我已经建立了一个密码哈希器,它模仿了Drupal的算法并使迁移变得容易。因为我已经接受了答案,所以我不会拒绝,但是对于将来想要对Drupal进行Django迁移的任何人,代码都存储在Django snippets和GitHub gist中。
最佳答案
我不太了解Drupal,但我想密码是散列存储的。如果是这种情况,则必须复制密码(我的意思是,原样复制它们),并且必须使用完全相同的Drupal方式和相同的Security Salt来更改Django哈希其密码的方式。
我真的不知道该怎么做,但是密码逻辑包含在User对象中。例如。 User.set_password()
函数(描述为here)使用make_password函数。
我认为通过一些研究,您会找到改变它的方法,但重要的是,请记住功能必须相等! IE:
对于允许的密码集中的每个x,drupal_hash(x)== django_hash(x)。
编辑:
深入了解django,可以使用get_hasher函数获取has函数。现在在1.4版本中,有一种方法可以指定Django如何选择该功能。看看这个:https://docs.djangoproject.com/en/dev/topics/auth/#how-django-stores-passwords
最后,为了创建自己的函数,您可以在MD5PasswordHasher上看看它是如何完成的。看起来真的很简单。您可以使用hashlib python library生成sha-512算法。
更改编码方法将需要类似以下内容:
def encode(self, password, salt):
assert password
assert salt and '$' not in salt
hash = hashlib.sha512(salt + password).hexdigest()
return "%s$%s$%s" % (self.algorithm, salt, hash)
关于django - 将密码从Drupal 7迁移到Django,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9876700/