使用 pbkdf2 哈希 p​​w 将 Typo3 用户迁移到 Wordpress phpass 哈希方法

Migrate Typo3 user with pbkdf2 hashed pw to Wordpress phpass hash method

基本上,我想将使用 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=

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

你好,朱利安

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

你写道你试过这个:

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_sha2560000$BbirbJq1C1G7$IcYmssO2bsILHcTCzLxPs/YmVGNmKb3cSt2JWzVzP2I=

因此这表明:

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

只需将所有内容连接在一起,您就会得到一个适用于 TYPO3 的兼容散列。在分隔符 ($) 处爆炸,您将得到各个部分。

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

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

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

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