php - 哈希函数在ColdFusion 10+和PHP 7.x上的功能相同吗?

标签 php hash coldfusion coldfusion-10 sha512

我目前正在为当前正在使用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_outputhash()参数为每个循环提供二进制表示,这将为我们提供相同的最终输出。之后,我们使用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/

相关文章:

php - 从外部网站获取文件数

php - 地址栏位置的 Apache 重写规则

php - Yii2 -active record - Group where 条件

php - 使用php从sql数据库中整理数据

algorithm - 无法理解 topcoder 解释的 Rabin Karp 算法的哈希函数

ruby-on-rails - Rails、二维表、pivot、嵌套散列循环

coldfusion - 如何在 CFSCRIPT 中创建 Java 对象?

php - 如何在 PHP 中在 1 行上显示 4 个名称而不是在新行上显示每个名称?

python - 哈希方法在 python 2 中是默认的,而不是 python 3

javascript - 图片上传不会失败