将密码从Drupal 7迁移到Django

Dav*_*son 10 passwords django cryptography drupal sha

我正在将一个站点从Drupal 7迁移到Django 1.4,包括当前用户.如何使用Drupal散列的密码?

根据,Drupal 7的使用SHA-512(它们被存储在开头"$ S $"的字符串的形式)散列的口令.

Django 1.4现在包含许多用于存储密码的选项,默认值为SHA-256,但我找不到SHA-512的选项.虽然这个应用程序似乎允许使用SHA2算法,但我不确定它是否与Django 1.4兼容(因为1.4具有灵活的密码哈希).

最简单的方法是什么?

ETA:我已经构建了一个模拟Drupal算法并使迁移变得简单的密码哈希.由于我已经接受了答案,我不会接受,但对于任何想要将Drupal转移到Django迁移的人来说,代码存储在Django片段GitHub的要点上.

san*_*lto 5

我不太了解Drupal,但我认为密码存储了哈希.如果是这种情况,你将不得不复制密码(我的意思是,将它们保持不变),你将不得不改变Django散列密码的方式,使用与Drupal完全相同的方式,使用相同的安全盐.

我真的不知道该怎么做,但密码的逻辑包含在User对象中.例如.的User.set_password()功能(描述在这里)使用make_password功能.

我想通过一些研究你会发现改变它的方法,但重要的是,记住功能必须是平等的!即:

对于允许的密码集中的每个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库生成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)
Run Code Online (Sandbox Code Playgroud)

  • 如果有人在将来尝试:salt是存储的Drupal字符串中第12个字符到第5个字符 (3认同)
  • 解决了!代码在我上面的问题中发布(通常我会回答我自己的问题并接受,但我不喜欢不接受答案) (2认同)