我目前正在为当前正在使用ColdFusion 10的站点创建一个新的PHP站点。当新站点就绪时,ColdFusion站点将停止使用,并且我将无法访问与ColdFusion相关的任何内容。我不想重置所有先前的密码,因此需要能够复制PHP的ColdFusion中使用的单向SHA-512哈希。
关于堆栈溢出的此问题与以下问题非常相关:
hash function that works identically on ColdFusion MX7 and PHP 5.x?
区别在于它们在ColdFusion中以1024个迭代手动循环。我正在翻译的ColdFusion站点使用内置的迭代功能。我已经尝试了他们在上述问题中所做的工作,最后尝试了一些变体,包括XOR,但最终我找不到有关这些迭代期间ColdFusion所做的工作的文档。
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做足准备,我也没有设法重复迭代步骤,所以问题是,ColdFusion 10+在迭代步骤中做什么操作?
最佳答案
无论使用哪种语言,SHA-512
散列函数都应在给定相同输入的情况下返回相同的输出。在这里,看起来您可能只需要确保输入相同即可。这包括您输入的文本的编码。然后,您将对其进行哈希处理,次数相同。
到目前为止,ColdFusion hash()
的CFDocs文档不正确,但是我已经对此进行了更正。请参阅上面有关我为何认为Adobe以这种方式列出默认值的评论。对于Lucee CFML,默认值为1迭代是正确的,但对于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()
函数返回哈希输入的HEXIDECIMAL字符串,但是当使用它的迭代参数时,它将对哈希值的BINARY输出进行迭代。这将在最终输出中产生很大的不同。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
raw_output
的hash()
参数为每个循环提供二进制表示,这将为我们提供相同的最终输出。之后,我们使用bin2hex()
将最终的二进制值转换为十六进制值,然后将strtoupper()
转换为大写。给我们1FA341B135918B61CB165AA67B33D024CC8243C679F20967A690C159D1A48FACFA4C57C33DDDE3D64539BF4211C44C8D1B18C787917CD779B2777856438E4D21
,匹配CF哈希值。另请注意,CF返回大写值,而PHP为小写。
最后一点:在PHP中有更好的方法来存储和使用哈希密码。这将有助于在CF和PHP哈希之间进行转换,但最终将所有存储的哈希转换为PHP等效可能更好。 https://www.php.net/manual/en/faq.passwords.php
================================================== ===========
需要澄清的一点是:
Adobe和Lucee都更改了此参数的名称以阐明其意图,但是它们的行为有所不同。
Lucee将参数
numIterations
命名为默认值1。这是hash()
运行的总次数。在CF2018中,通过引入命名参数,Adobe从原始的(cc仍为文档)
additionalIterations
重命名了参数iterations
。在CF2018之前,原始的不正确的参数名称并不重要,因为无论如何您都无法使用命名的参数。在其hash()
文档页面上,其用法是“因此,此参数为迭代次数+1。默认的其他迭代次数为0。” (强调我的)行为始终(自CF10起)与此描述匹配,但是显然其实际含义有些混乱,尤其是因为Lucee的行为和Adobe错误的参数初始名称有所不同。参数名称
iterations
不正确,不适用于Adobe CF 2018或Lucee 4.5或5.x。这是Lucee和Adobe ColdFusion之间当前不兼容的功能。要记住的重要一点,尤其是同时使用Adobe和Lucee代码时,如果运行相同的代码,则指定了
???Iterations
命名参数的此函数将产生两个不同的输出。与Lucee相比,Adobe将另外运行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
关于php - 哈希函数在ColdFusion 10+和PHP 7.x上的功能相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58840165/