在ColdFusion 10+;还有PHP7.x?

在ColdFusion 10+;还有PHP7.x?,php,hash,coldfusion,coldfusion-10,sha512,Php,Hash,Coldfusion,Coldfusion 10,Sha512,我目前正在开发一个新的PHP站点,该站点目前正在使用ColdFusion 10。当新站点准备就绪时,ColdFusion站点将退役,我将无法访问任何与ColdFusion相关的内容。我不想重置所有以前的密码,因此需要能够复制PHP中ColdFusion中使用的单向SHA-512哈希 堆栈溢出问题与此问题非常相关: 不同之处在于它们在ColdFusion中手动循环1024次迭代。我正在翻译的ColdFusion站点使用内置的迭代功能。我已经尝试了他们在上面的问题中所做的,加上一些变体,包括最后的

我目前正在开发一个新的PHP站点,该站点目前正在使用ColdFusion 10。当新站点准备就绪时,ColdFusion站点将退役,我将无法访问任何与ColdFusion相关的内容。我不想重置所有以前的密码,因此需要能够复制PHP中ColdFusion中使用的单向SHA-512哈希

堆栈溢出问题与此问题非常相关:

不同之处在于它们在ColdFusion中手动循环1024次迭代。我正在翻译的ColdFusion站点使用内置的迭代功能。我已经尝试了他们在上面的问题中所做的,加上一些变体,包括最后的XOR,但最终我找不到关于ColdFusion在这些迭代过程中所做工作的文档

ColdFusion:

<cfset hpswd = Hash(FORM.npswd & salt, "SHA-512", "UTF-8", 1000) >
给定此密码:
q7+Z6Wp@&#hQ

用这种盐:
F4DD573A-EC09-0A78-61B5DA6CBDB39F36

ColdFusion给出了这个散列(有1000次迭代):
1FA341B135918B61CB165AA67B33D024CC8243C679F20967A690C159D1A48FA4C57C33DEDE64539BF4211C44C8D1B18C787917CD779B2777856438E4D21


即使确保使用PHP实现strtoupper,我也没有复制迭代步骤,因此问题是,ColdFusion 10+在迭代步骤中做了什么操作数?

请参见“…在Adobe CF中,该值是额外迭代的次数。”

不考虑语言,给定相同的输入,
SHA-512
哈希函数应返回相同的输出。在这里,看起来您可能只需要确保您的输入是相同的。这包括您输入的文本的编码。然后,您将对其进行相同的总次数的哈希运算

到今天为止,ColdFusion
hash()
的CFDocs文档是不正确的,但是我已经提交了一个更正。请参阅我在上面的评论,了解我为什么相信Adobe会以这种方式列出其默认设置。Lucee CFML的默认迭代次数为1是正确的,但AdobeCF的默认迭代次数为0是正确的。CF2018澄清了该参数

现在,对于您的问题,您在ACF10中的原始代码是:

<cfset hpswd = Hash(FORM.npswd & salt, "SHA-512", "UTF-8", 1000) >
为我们提供
1FA341B135918B61CB165AA67B33D024CC8243C679F20967A690C159D1A48FAC457C33DEDE64539BF4211C44C8D1B18C787917CD779B2777856438E4D21

需要注意的一点是,ColdFusion
hash()
函数返回散列输入的十六进制字符串,但当它使用其迭代参数时,它会迭代散列值的二进制输出。这将对最终输出产生很大的影响

要在PHP中实现这一点,我们需要执行以下操作:

注意:我不是PHP开发人员,所以这可能不是最好的方法。请不要评判我。:-)


您是否考虑过编写一个ColdFusion Web服务,将哈希密码返回给PHP?我没有,但总体来说,主要思想是从等式中完全删除ColdFusion。该页面实际上不准确,因为默认迭代次数是0而不是1:问题不在于有多少额外的迭代,但这些迭代会产生什么样的逻辑呢。在类似的问题中,用户进行了额外的迭代,并使用salt对之前的散列进行散列。ColdFusion的迭代与此不匹配,但可能包括它。我只是不知道,因为我找不到关于它在幕后到底做了什么的文档。如果您不在CF中指定
iterations
,该怎么办?如果您使用的是相同的
SHA-512
算法,那么您得到的哈希值是否与PHP中得到的哈希值相同?我最近更新了CFDocs页面,它正在等待请求批准。Adobe似乎从字面上解释了“迭代”,因此1次“迭代”实际上是在重复一个流程1次额外的时间,因此流程运行2次。Lucee CFML将“迭代次数”视为运行
hash
函数的总次数而有所不同。两者都更改了参数名称以匹配其实际函数:Lucee是“numIterations”或运行
hash()
的总次数。Adobe 2018是
additionalIterations
或运行
hash()
的额外次数。Adobe的文档目前是不正确的(),但他们确实提到它是额外运行的
hash()
。还要确保您的编码与CF函数“UTF-8”的编码相匹配。谢谢Shawn,我认为这样的回答会使问题更为有效,因为它清楚地回答了问题,并且超越了基本答案。将来我们计划使用PHP方法存储散列。我要注意的唯一一点是,默认情况下PHP中没有启用mb_internal_编码(如果未启用,将为500页),但是如果您需要确保编码与ColdFusion中的编码匹配,这绝对是一种方法。从您的答案中获益,每次迭代都不需要在十六进制和二进制之间转换并返回十六进制,这很有意义。@谢谢您让我不得不认真思考一些我认为理所当然的事情。散列总是很有趣,因为散列的整个要点是您的输出不可识别,因此匹配两种不同类型的散列可能是一个挑战。(即使是在Adobe CF和Lucee CF之间)。:-)
<cfset npswd="q7+Z6Wp@&##hQ">
<cfset salt = "F4DD573A-EC09-0A78-61B5DA6CBDB39F36">
<cfset hpswd = Hash(npswd & salt, "SHA-512","UTF-8",1000) >

<cfoutput>#hpswd#</cfoutput>
<?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)));
?> 
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