- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在将大量用户帐户从一个遗留的 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_password
和 User.check_password
使用 Passlib 而不是内置代码。上面的配置字符串将 passlib 配置为模仿 Django 的内置哈希,但随后添加了对 md5_crypt 的支持,因此您的哈希应该按原样接受。
关于php - 来自 PHP 的 crypt() 的 MD5 散列密码是否可以移植到 Django 密码字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7338618/
我正在将一些 C 代码从 Linux 迁移到 Mac OSX (yosemite)。 Mac OSX crypt() 函数(在 unistd.h 中,正如我所确定的)与 Linux 中的 gcc/gn
我确实对 crypt() PHP 函数感到困惑。 当第二个 crypt 显然使用不同的第二个参数时,以下两个 crypt 函数如何给出相同的输出?差异盐意味着差异哈希对吗? echo crypt("p
我正在为 CS50 做第 2 周的 pset。 使用 crypt 函数时,指向任何字符串密文的 char 指针总是指向我加密的最后一个东西。 例如: char password[] = "AAAA";
我已经使用 c 中的 crypt 函数来加密给定的字符串。我写了下面的代码, #include #include int main() { printf("%s\n",crypt("passw
我正在比较 PHP 的 crypt() 与 Python 的 crypt()。来自阅读 Python 手册: http://docs.python.org/2/library/crypt.html P
我正在比较 PHP 的 crypt() 与 Python 的 crypt()。来自阅读 Python 手册: http://docs.python.org/2/library/crypt.html P
出于某种原因,无论我尝试什么,使用crypt模块都会使用13字符哈希而不是sha-512。我见过无数关于问题的问题,但没有一个符合我的。难道就没有办法改变 crypt 方法吗? >>> import
我想用 crypt 散列密码使用 blowfish 加密的模块。 在 Fedora 29 上我得到了正确的结果: $ python3.7 Python 3.7.2 (default, Jan 3 2
我目前正在研究 Violent Python 一书中的一个示例。你可以看到我的实现 here 我现在正尝试在 Go 中实现相同的脚本来比较性能,注意我是 Go 的新手。打开文件并遍历这些行很好,但是我
背景 crypt 有两个定义,from the docs, 其中一个使用 unistd.h #define _XOPEN_SOURCE /* See feature_test_macros
我使用 dovecot 作为我的邮件传输代理,我的目标是使用 strongest password scheme我的系统支持:SHA512-CRYPT 或 SHA256-CRYPT(BLF-CRYPT
我正在学习 Python。我不明白为什么 hashlib.sha512(salt + password).hexdigest() 没有给出预期的结果。 我正在寻找与 Ulrich Drepper 的
我正在使用 GCC 4.6.0(在一个其他身份不明的平台上)。 我正在使用 crypt() 函数来加密密码。 我以前从未使用过该功能,所以我查看了主页: man 3 crypt 它说要包含 unist
我正在为 Linux 上的 MD5 哈希方案编写一个基本的密码破解程序 /etc/shadow file 。当我使用commons.codec时的DigestUtils或Crypt库,它们的哈希长度是
我更喜欢在 php 中使用 crypt 函数来进行密码加密和其他单向加密要求。因为我可以使用任何受支持的加密算法,通过更改 salt 并且几乎没有其他优势。通常,我不使用任何盐,它使用随机的 MD5
我有点困惑。当我用盐和密码调用 crypt 时,返回的字符串称为哈希或摘要?我很困惑,因为我知道从加密函数返回的内容称为哈希。但是当我们调用crypt 我们也传递 salt 作为参数。我们可以这样说:
本文整理了Java中freenet.crypt.Yarrow类的一些代码示例,展示了Yarrow类的具体用法。这些代码示例主要来源于Github/Stackoverflow/Maven等平台,是从一些
我正在做一个练习,其中我需要将字符串中的字母替换为另一个字母(字母表中它前面的第四个字母)。我还必须消除除空格之外的所有非字母字符(“”)。到目前为止,我能够完成第一步(消除字符),但我无法替换字母。
我正在为我的网站创建我的更改密码网站,我的代码有一些问题...... 出于某种原因,我很难在加密后在数据库中比较和替换密码。 我想要这个: 获取当前用户密码并将其与 $oldpass 的输入值进行比较
当我使用 MD5 时,我曾经在数据库中创建一个 varchar(32) 列。但是,我开始使用 crypt(),据我所知,输出长度是可变的。那么我应该为 varchar 设置哪个长度? 最佳答案 返回的
我是一名优秀的程序员,十分优秀!