当我没有明文时,如何为 PHP 中的 htpasswd 文件生成 md5 哈希

How to generate a md5 hash for an htpasswd file in PHP when I don't have the plaintext

我的数据库中有使用 md5 加密的用户密码的记录。我想让 PHP 将那些加密的密码添加到 htpasswd 文件中。但是我读到 htpasswd 文件使用了一个重复 1000 次并加盐的 MD5 算法。我在网上找到了很多关于如何从明文创建散列的示例,但在这种情况下,我没有明文。我正在尝试从已经加密的 md5 哈希开始生成 htpasswd 哈希。我应该编写自己的代码来对其进行 999 次哈希处理,然后加盐吗?我该怎么做?

这是在 Linux 服务器上 PHP 5 和 MySQL。

有两种方法可以在 .htpasswd 中存储基于 MD5 的哈希:标准 md5crypt 和 Apache 自己的 MD5 哈希。这两个算法是相同的,但它们使用不同的魔法字符串常量。

如您所说,它们基于 md5'ing 1000 次,但如果您 look closely at the algorithm,您会看到它在每次迭代中附加明文密码。

不只是md5(md5(md5(...)))),而是一个相当复杂的md5(password+salt+password+md5(md5(...)+salt+password+password))

因此,计算一个.htpasswdmd5密码,需要实际的明文密码。 md5(password) 对你一点帮助都没有。


那么你可以做什么呢?

  • 您可以使用不同形式的 Apache 身份验证,例如 mod_auth_form,对您的数据库进行您自己的身份验证。无论如何,这可能是最好的选择。

  • 通过在数据库中存储 md5(password),您引入了一个巨大的安全漏洞。您(和任何攻击者)可以使用基于 GPGPU 的 md5 破解程序在一天内获取其中大部分的明文。

  • 您可以要求用户下次登录时修改密码,给您一个明文密码,您可以借此机会修复这个安全漏洞。