在 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“...在 Adob​​e CF 中,该值是额外迭代的次数。”

无论使用何种语言,SHA-512 散列函数都应该return 在给定相同输入的情况下得到相同的输出。在这里,看起来您可能只需要确保您的输入是相同的。这包括您输入的文本的编码。然后,您将对它进行相同的 次哈希处理。

截至今天,ColdFusion hash() 的 CFDocs 文档是不正确的,但我已经提交了更正。请参阅我上面关于为什么我相信 Adob​​e 以这种方式列出其默认值的评论。 1 次迭代的默认值对于 Lucee CFML 是正确的,但对于 Adob​​e 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 的行为和 Adob​​e 不正确的参数初始名称的区别。

参数名称 iterations 不正确,不适用于 Adob​​e CF 2018 或 Lucee 4.5 或 5.x。这是一个目前在 Lucee 和 Adob​​e ColdFusion 之间不兼容的功能。

要记住的重要一点,特别是如果同时使用 Adob​​e 和 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