0

基本上,我想将使用 pbkdf2-sha256 散列的 pw 的用户列表迁移到使用 phpass 的 cms。

为了做到这一点,我尝试检查用户输入的密码并生成typo3散列密码,以便将其与数据库中的记录进行比较。


我试图对typo3使用的pbkdf2散列进行逆向工程(使用示例用户pw),但我没有得到预期的结果:

base64_encode( hash_pbkdf2( "sha256", "88t8R7EfRj9Xf3P", "4f3YKAmnn1dBBU1OPwfdzQ", 25000, 0, true ));

结果:x806WJJRfoHq25Pq2OTs3xfa18qIJ7tzwWaAzO3aKzU=

数据库中存储的散列密码是:

$pbkdf2-sha256$25000$4f3YKAmnn1dBBU1OPwfdzQ$ fq4u5vEp6hm8G6Xi7E2UcnEjcLRgMhJ2Yx9v7ikWyZs


当我使用堆栈溢出的给定示例尝试此操作时,它可以工作:

 base64_encode( hash_pbkdf2( "sha256", "school bus", "BbirbJq1C1G7", 100000, 0, true ));

结果:IcYmssO2bsILHcTCzLxPs/YmVGNmKb3cSt2JWzVzP2I=

预期结果:pbkdf2_sha256$100000$BbirbJq1C1G7$ IcYmssO2bsILHcTCzLxPs/YmVGNmKb3cSt2JWzVzP2I=

如果有人可以提供帮助,我将不胜感激。

问候,朱利安

4

2 回答 2

0

如果您仔细查看最后一个示例,您会自行找到答案。

你写你试过这个:

base64_encode( hash_pbkdf2( "sha256", "88t8R7EfRj9Xf3P", "4f3YKAmnn1dBBU1OPwfdzQ", 25000, 0, true ));

并且散列不正确,但这个是“部分”你所期望的:

base64_encode( hash_pbkdf2( "sha256", "school bus", "BbirbJq1C1G7", 100000, 0, true ));

这里的主要区别是使用 100000 与 25000。您必须提供与 TYPO3 相同的参数(首先)。

其次,由 TYPO3 生成并存储在数据库中的散列是您从该方法调用中获得的,并且前缀是一些关于散列的附加信息。在你的最后一个例子中,这个:

pbkdf2_sha256$100000$BbirbJq1C1G7$IcYmssO2bsILHcTCzLxPs/YmVGNmKb3cSt2JWzVzP2I=

因此这表明:

  1. 使用的哈希算法 (pbkdf2_sha256)
  2. 分隔符 ($)
  3. 运行次数 (100000)
  4. 分隔符 ($)
  5. 哈希算法使用的盐 (BbirbJq1C1G7)
  6. 分隔符 ($)
  7. 哈希本身(IcYms...)

只需将所有内容连接在一起,您将获得 TYPO3 的兼容哈希。在分隔符 ($) 处爆炸,您将得到各个部分。

现在,这自然很明显,但只是为了完整……您将无法将哈希从一种算法“转换”或“迁移”到另一种算法,因为这会破坏整个安全性。哈希不是加密密码,它是单向操作。因此,为您的 Wordpress 安装从 pbkdf2_sha256“迁移”到 phppass 的唯一方法是从您的用户那里获取真实密码(对您来说,这意味着在 TYPO3 的身份验证过程中)并使用您需要的新算法对其进行哈希处理,因此要么随着时间的推移将所有 TYPO3 用户密码迁移到新算法,要么将这两种表示形式存储在“某处”。

于 2021-07-20T06:14:38.620 回答
0

除了填充之外,这可以解决问题:

$salt = base64_decode("4f3YKAmnn1dBBU1OPwfdzQ");
$hash_to_compare_with_db = base64_encode( hash_pbkdf2( "sha256", "88t8R7EfRj9Xf3P", $salt, 25000, 0, true ));

感谢所有人,尤其是用户 9014097

于 2021-07-20T12:45:48.243 回答