使用 pbkdf2 哈希 pw 将 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=
因此这表明:
- 正在使用的哈希算法(pbkdf2_sha256)
- 一个分隔符 ($)
- 数量运行 (100000)
- 一个分隔符 ($)
- 哈希算法 (BbirbJq1C1G7) 使用的盐
- 一个分隔符 ($)
- 哈希本身 (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
基本上,我想将使用 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=
因此这表明:
- 正在使用的哈希算法(pbkdf2_sha256)
- 一个分隔符 ($)
- 数量运行 (100000)
- 一个分隔符 ($)
- 哈希算法 (BbirbJq1C1G7) 使用的盐
- 一个分隔符 ($)
- 哈希本身 (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