在 ColdFusion 10+ 和 PHP 7.x 上工作相同的哈希函数?
Hash Function that works identically on ColdFusion 10+ and PHP 7.x?
我目前正在为一个目前使用 ColdFusion 10 的网站创建一个新的 PHP 网站。当新网站准备就绪时,ColdFusion 网站将停用,我将无法访问与 ColdFusion 相关的任何内容.我不想重置所有以前的密码,因此需要能够复制 ColdFusion 中使用的单向 SHA-512 哈希 PHP。
Stack Overflow 上的这个问题与这个问题非常相关:
hash function that works identically on ColdFusion MX7 and PHP 5.x?
不同之处在于它们在 ColdFusion 中手动循环了 1024 次迭代。我正在翻译的 ColdFusion 站点使用内置的迭代功能。我已经尝试了他们在上述问题中所做的事情,最后加上一些变体,包括 XOR,但最终我找不到关于 ColdFusion 在这些迭代过程中所做的事情的文档。
冷聚变:
<cfset hpswd = Hash(FORM.npswd & salt, "SHA-512", "UTF-8", 1000) >
PHP(没有迭代逻辑):
$hpswd = strtoupper(hash("sha512", $npswd.$salt));
给出此密码:q7+Z6Wp@&#hQ
用这种盐:F4DD573A-EC09-0A78-61B5DA6CBDB39F36
ColdFusion 给出此哈希(迭代 1000 次):1FA341B135918B61CB165AA67B33D024CC8243C679F20967A690C159D1A48FACFA4C57C33DDDE3D64539BF4211C44C8D1B18C787917CD779B2777856438E4D21
即使确保使用 PHP 进行 strtoupper,我也没有设法复制迭代步骤,所以问题是,ColdFusion 10+ 在迭代步骤中做了什么操作数?
参见 https://cfdocs.org/hash“...在 Adobe CF 中,该值是额外迭代的次数。”
无论使用何种语言,SHA-512
散列函数都应该return 在给定相同输入的情况下得到相同的输出。在这里,看起来您可能只需要确保您的输入是相同的。这包括您输入的文本的编码。然后,您将对它进行相同的 总 次哈希处理。
截至今天,ColdFusion hash()
的 CFDocs 文档是不正确的,但我已经提交了更正。请参阅我上面关于为什么我相信 Adobe 以这种方式列出其默认值的评论。 1 次迭代的默认值对于 Lucee CFML 是正确的,但对于 Adobe CF 则不正确。你是对的,ACF默认是0。CF2018澄清了这个参数。
现在,对于您的问题,您在 ACF10 中的原始代码是:
<cfset hpswd = Hash(FORM.npswd & salt, "SHA-512", "UTF-8", 1000) >
这表示您正在 hash
使用 SHA-512
算法,使用 UTF-8
编码,并额外重复 1000 次。这意味着您的 hash()
函数实际上被调用了 1001 次以获得最终输出。
所以:
<cfset npswd="q7+Z6Wp@&##hQ">
<cfset salt = "F4DD573A-EC09-0A78-61B5DA6CBDB39F36">
<cfset hpswd = Hash(npswd & salt, "SHA-512","UTF-8",1000) >
<cfoutput>#hpswd#</cfoutput>
给我们 1FA341B135918B61CB165AA67B33D024CC8243C679F20967A690C159D1A48FACFA4C57C33DDDE3D64539BF4211C44C8D1B18C787917CD779B2777856438E4D21
.
https://trycf.com/gist/7212b3ee118664c5a7f1fb744b30212d/acf?theme=monokai
需要注意的一件事是 ColdFusion hash()
函数 return 是哈希输入的十六进制字符串,但是当它使用它的迭代参数时,它迭代哈希值的二进制输出.这将对最终输出产生很大影响。
https://trycf.com/gist/c879e9e900e8fd0aa23e766bc308e072/acf?theme=monokai
要在 PHP 中执行此操作,我们将执行以下操作:
注意:我不是 PHP 开发人员,因此这可能不是执行此操作的最佳方法。请不要评判我。 :-)
<?php
mb_internal_encoding("UTF-8");
$npswd="q7+Z6Wp@&#hQ";
$salt = "F4DD573A-EC09-0A78-61B5DA6CBDB39F36";
$hpswd = $npswd.$salt ;
for($i=1; $i<=1001; $i++){
$hpswd = hash("SHA512",$hpswd,true); // raw_output=true argument >> raw binary data.
// > https://www.php.net/manual/en/function.hash.php
}
echo(strtoupper(bin2hex($hpswd)));
?>
我做的第一件事是确保我们使用的编码是 UTF-8。然后我迭代给定的输入字符串 1+1000 次。使用 PHP hash()
的 raw_output
参数为我们提供了每个循环的二进制表示,这将为我们提供相同的最终输出。之后,我们使用 bin2hex()
将最终的二进制值转换为十六进制值,然后使用 strtoupper()
将其转为大写。给我们 1FA341B135918B61CB165AA67B33D024CC8243C679F20967A690C159D1A48FACFA4C57C33DDDE3D64539BF4211C44C8D1B18C787917CD779B2777856438E4D21
,匹配 CF 散列值。
另请注意,CF return 是大写值,而 PHP 是小写值。
最后一点:PHP 中有更好的方法来存储和使用散列密码。这将有助于在 CF 和 PHP 哈希之间进行转换,但最终将所有存储的哈希转换为 PHP 等价物可能会更好。 https://www.php.net/manual/en/faq.passwords.php
====================================== =====================
澄清一点:
Adobe 和 Lucee 都更改了此参数的名称以阐明其意图,但它们的行为有所不同。
Lucee 将参数 numIterations
命名为默认值 1。这是 hash()
将 运行 的总次数。
在 CF2018 中,随着命名参数的引入,Adobe 将参数 additionalIterations
从原始(并且仍然记录在案)iterations
重命名。在 CF2018 之前,原始不正确的参数名称无关紧要,因为您无论如何都无法使用命名参数。在他们的 hash()
文档页面上,他们的措辞是 "Hence, this parameter is the number of iterations + 1. The default number of additional iterations is 0."(强调我的)行为一直(自 CF10 起)符合此描述,但显然对其实际含义有些混淆,特别是因为有与 Lucee 的行为和 Adobe 不正确的参数初始名称的区别。
参数名称 iterations
不正确,不适用于 Adobe CF 2018 或 Lucee 4.5 或 5.x。这是一个目前在 Lucee 和 Adobe ColdFusion 之间不兼容的功能。
要记住的重要一点,特别是如果同时使用 Adobe 和 Lucee 代码,如果相同的代码是 运行. Adobe 将 运行 与 Lucee 再 hash()
一次。好消息是,由于参数名称不相同,因此如果使用它们,将抛出错误,而不是默默地产生不同的哈希值。
hash("Stack Overflow","md5","UTF-8",42) ;
// Lucee: C0F20A4219490E4BF9F03ED51A546F27
// Adobe: 42C57ECBF9FF2B4BEC61010B7807165A
hash(input="Stack Overflow", algorithm="MD5", encoding="UTF-8", numIterations=42) ;
// Lucee: C0F20A4219490E4BF9F03ED51A546F27
// Adobe: Error: Parameter validation error
hash(string="Stack Overflow", algorithm="MD5", encoding="UTF-8", additionalIterations=42) ;
// Lucee: Error: argument [ADDITIONALITERATIONS] is not allowed
// Adobe: 42C57ECBF9FF2B4BEC61010B7807165A
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-h-im/hash.html
https://docs.lucee.org/reference/functions/hash.html
我目前正在为一个目前使用 ColdFusion 10 的网站创建一个新的 PHP 网站。当新网站准备就绪时,ColdFusion 网站将停用,我将无法访问与 ColdFusion 相关的任何内容.我不想重置所有以前的密码,因此需要能够复制 ColdFusion 中使用的单向 SHA-512 哈希 PHP。
Stack Overflow 上的这个问题与这个问题非常相关: hash function that works identically on ColdFusion MX7 and PHP 5.x?
不同之处在于它们在 ColdFusion 中手动循环了 1024 次迭代。我正在翻译的 ColdFusion 站点使用内置的迭代功能。我已经尝试了他们在上述问题中所做的事情,最后加上一些变体,包括 XOR,但最终我找不到关于 ColdFusion 在这些迭代过程中所做的事情的文档。
冷聚变:
<cfset hpswd = Hash(FORM.npswd & salt, "SHA-512", "UTF-8", 1000) >
PHP(没有迭代逻辑):
$hpswd = strtoupper(hash("sha512", $npswd.$salt));
给出此密码:q7+Z6Wp@&#hQ
用这种盐:F4DD573A-EC09-0A78-61B5DA6CBDB39F36
ColdFusion 给出此哈希(迭代 1000 次):1FA341B135918B61CB165AA67B33D024CC8243C679F20967A690C159D1A48FACFA4C57C33DDDE3D64539BF4211C44C8D1B18C787917CD779B2777856438E4D21
即使确保使用 PHP 进行 strtoupper,我也没有设法复制迭代步骤,所以问题是,ColdFusion 10+ 在迭代步骤中做了什么操作数?
参见 https://cfdocs.org/hash“...在 Adobe CF 中,该值是额外迭代的次数。”
无论使用何种语言,SHA-512
散列函数都应该return 在给定相同输入的情况下得到相同的输出。在这里,看起来您可能只需要确保您的输入是相同的。这包括您输入的文本的编码。然后,您将对它进行相同的 总 次哈希处理。
截至今天,ColdFusion hash()
的 CFDocs 文档是不正确的,但我已经提交了更正。请参阅我上面关于为什么我相信 Adobe 以这种方式列出其默认值的评论。 1 次迭代的默认值对于 Lucee CFML 是正确的,但对于 Adobe CF 则不正确。你是对的,ACF默认是0。CF2018澄清了这个参数。
现在,对于您的问题,您在 ACF10 中的原始代码是:
<cfset hpswd = Hash(FORM.npswd & salt, "SHA-512", "UTF-8", 1000) >
这表示您正在 hash
使用 SHA-512
算法,使用 UTF-8
编码,并额外重复 1000 次。这意味着您的 hash()
函数实际上被调用了 1001 次以获得最终输出。
所以:
<cfset npswd="q7+Z6Wp@&##hQ">
<cfset salt = "F4DD573A-EC09-0A78-61B5DA6CBDB39F36">
<cfset hpswd = Hash(npswd & salt, "SHA-512","UTF-8",1000) >
<cfoutput>#hpswd#</cfoutput>
给我们 1FA341B135918B61CB165AA67B33D024CC8243C679F20967A690C159D1A48FACFA4C57C33DDDE3D64539BF4211C44C8D1B18C787917CD779B2777856438E4D21
.
https://trycf.com/gist/7212b3ee118664c5a7f1fb744b30212d/acf?theme=monokai
需要注意的一件事是 ColdFusion hash()
函数 return 是哈希输入的十六进制字符串,但是当它使用它的迭代参数时,它迭代哈希值的二进制输出.这将对最终输出产生很大影响。
https://trycf.com/gist/c879e9e900e8fd0aa23e766bc308e072/acf?theme=monokai
要在 PHP 中执行此操作,我们将执行以下操作:
注意:我不是 PHP 开发人员,因此这可能不是执行此操作的最佳方法。请不要评判我。 :-)
<?php
mb_internal_encoding("UTF-8");
$npswd="q7+Z6Wp@&#hQ";
$salt = "F4DD573A-EC09-0A78-61B5DA6CBDB39F36";
$hpswd = $npswd.$salt ;
for($i=1; $i<=1001; $i++){
$hpswd = hash("SHA512",$hpswd,true); // raw_output=true argument >> raw binary data.
// > https://www.php.net/manual/en/function.hash.php
}
echo(strtoupper(bin2hex($hpswd)));
?>
我做的第一件事是确保我们使用的编码是 UTF-8。然后我迭代给定的输入字符串 1+1000 次。使用 PHP hash()
的 raw_output
参数为我们提供了每个循环的二进制表示,这将为我们提供相同的最终输出。之后,我们使用 bin2hex()
将最终的二进制值转换为十六进制值,然后使用 strtoupper()
将其转为大写。给我们 1FA341B135918B61CB165AA67B33D024CC8243C679F20967A690C159D1A48FACFA4C57C33DDDE3D64539BF4211C44C8D1B18C787917CD779B2777856438E4D21
,匹配 CF 散列值。
另请注意,CF return 是大写值,而 PHP 是小写值。
最后一点:PHP 中有更好的方法来存储和使用散列密码。这将有助于在 CF 和 PHP 哈希之间进行转换,但最终将所有存储的哈希转换为 PHP 等价物可能会更好。 https://www.php.net/manual/en/faq.passwords.php
====================================== =====================
澄清一点:
Adobe 和 Lucee 都更改了此参数的名称以阐明其意图,但它们的行为有所不同。
Lucee 将参数 numIterations
命名为默认值 1。这是 hash()
将 运行 的总次数。
在 CF2018 中,随着命名参数的引入,Adobe 将参数 additionalIterations
从原始(并且仍然记录在案)iterations
重命名。在 CF2018 之前,原始不正确的参数名称无关紧要,因为您无论如何都无法使用命名参数。在他们的 hash()
文档页面上,他们的措辞是 "Hence, this parameter is the number of iterations + 1. The default number of additional iterations is 0."(强调我的)行为一直(自 CF10 起)符合此描述,但显然对其实际含义有些混淆,特别是因为有与 Lucee 的行为和 Adobe 不正确的参数初始名称的区别。
参数名称 iterations
不正确,不适用于 Adobe CF 2018 或 Lucee 4.5 或 5.x。这是一个目前在 Lucee 和 Adobe ColdFusion 之间不兼容的功能。
要记住的重要一点,特别是如果同时使用 Adobe 和 Lucee 代码,如果相同的代码是 运行. Adobe 将 运行 与 Lucee 再 hash()
一次。好消息是,由于参数名称不相同,因此如果使用它们,将抛出错误,而不是默默地产生不同的哈希值。
hash("Stack Overflow","md5","UTF-8",42) ;
// Lucee: C0F20A4219490E4BF9F03ED51A546F27
// Adobe: 42C57ECBF9FF2B4BEC61010B7807165A
hash(input="Stack Overflow", algorithm="MD5", encoding="UTF-8", numIterations=42) ;
// Lucee: C0F20A4219490E4BF9F03ED51A546F27
// Adobe: Error: Parameter validation error
hash(string="Stack Overflow", algorithm="MD5", encoding="UTF-8", additionalIterations=42) ;
// Lucee: Error: argument [ADDITIONALITERATIONS] is not allowed
// Adobe: 42C57ECBF9FF2B4BEC61010B7807165A
https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-h-im/hash.html https://docs.lucee.org/reference/functions/hash.html