gpt4 book ai didi

php - 来自 PHP 的 crypt() 的 MD5 散列密码是否可以移植到 Django 密码字段?

转载 作者:太空狗 更新时间:2023-10-29 21:35:28 24 4
gpt4 key购买 nike

我正在将大量用户帐户从一个遗留的 PHP 网站移植到一个新的、 Shiny 的基于 Django 的网站。一堆密码存储为 PHP 的 crypt() 的 MD5 散列输出。函数(请参阅此处的第三个示例)。

给定来自遗留应用程序的密码哈希值:

$1$f1KtBi.v$nWwBN8CP3igfC3Emo0OB8/

我如何将它转换为 md5$<salt>$<hash> 的 Django 形式? crypt() MD5 输出似乎使用了与 Django 的 MD5 支持不同的字母表(它似乎使用了 hexdigest)。

更新:

有一个 similar (and unanswered) question有一个有趣的潜在解决方案将 PHP 哈希转换为 base-16 编码,但基于一些初步的探索,它似乎没有产生可用的 MD5 hexdigest。 :(

具体例子:

一个具体的例子可能会有所帮助。

给定:

  • 密码 foo
  • $1$aofigrjlh 的盐

在 PHP 中,crypt('foo', '$1$aofigrjlh')产生 $1$aofigrjl$xLnO.D8x064D1kDUKWwbX. 的散列.

crypt()以MD5模式运行,但它是一些wacky Danish translation MD5 算法(更新: 它是 MD5-Crypt)。由于 Python 是 Dutch-derived language , Python 的 crypt模块仅支持 DES 风格的散列。

在 Python 中,我需要能够在给定原始密码和盐的情况下重现该散列或它的一些常规推导。

最佳答案

不幸的是,无法将它们转换为 Django 的格式(尽管您可以采用一条可能的途径来导入您的哈希值,详见下文)。

Django的salted md5算法使用了一个非常简单的算法:md5(salt + password) ,然后编码为十六进制。

另一方面,PHP 的 crypt() 输出的哈希值以 $1$ 开头不是简单的 md5 哈希。相反,他们使用称为 MD5-Crypt 的密码哈希算法。 .这比简单的 md5 哈希要复杂(和安全)得多。链接页面中有一个部分描述了 MD5-Crypt 格式和算法。无法将其转换为 Django 的格式,因为它不在其代码中提供对算法的支持。

虽然 Django 确实有调用 Python 标准库的代码 crypt()函数,Django 破坏散列的方式意味着没有简单的方法来获得以 $1$ 开头的散列一路通过 Django 进入 crypt() ;这是向crypt()发出信号的唯一方式您想使用 MD5-Crypt 而不是旧的 DES-Crypt。


但是,有一个可能的途径:你可以用 monkeypatch django.contrib.auth.models.User这样它既支持普通的 Django 哈希,也支持 MD5-Crypt 格式。这样你就可以不加改变地导入散列。一种方法是通过覆盖 User.set_password 手动执行此操作和 User.check_password方法。

另一种选择是使用 Passlib库,其中包含一个 Django 应用程序,旨在处理所有这些问题,并为 md5-crypt 等提供跨平台支持。 (免责声明:我是该库的作者) 不幸的是,Django 插件没有记录,因为我没有在我自己的 django 部署之外对其进行太多测试......尽管它对他们来说工作得很好 :)( source 中有一些 beta 文档) 编辑:从 Passlib 1.6 开始,此扩展现已正式发布并且 documented .

为了使用它,安装 passlib,并添加 passlib.ext.django到您已安装的应用程序列表。然后,在 settings.py 内, 添加以下内容:

PASSLIB_CONFIG = """
[passlib]
schemes =
md5_crypt,
django_salted_sha1, django_salted_md5,
django_des_crypt, hex_md5,
django_disabled

default = md5_crypt

deprecated = django_des_crypt, hex_md5
"""

这将覆盖 User.set_passwordUser.check_password使用 Passlib 而不是内置代码。上面的配置字符串将 passlib 配置为模仿 Django 的内置哈希,但随后添加了对 md5_crypt 的支持,因此您的哈希应该按原样接受。

关于php - 来自 PHP 的 crypt() 的 MD5 散列密码是否可以移植到 Django 密码字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7338618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com