无法匹配 php hash_hmac() 和 Coldfusion hmac() 的结果

dev*_*dev 0 php coldfusion hash sha256

我正在致力于加密 URL 并将工作脚本从 PHP 转换为 ColdFusion。我已经完成了 95% 的工作,但在尝试了 StackOverflow 上的许多解决方案后,我陷入了困境。我的结果仍然不匹配。我确认两个脚本上的saltBinkeyBin值是相同的。请看一看。

\n

PHP版本

\n
$saltBin = R\xef\xbf\xbdk\xef\xbf\xbd\xef\xbf\xbdE\xef\xbf\xbdx^ \xef\xbf\xbdO<\xef\xbf\xbd-\xef\xbf\xbd7J=S\xef\xbf\xbdz\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd \xef\xbf\xbd;\n$keyBin = \xef\xbf\xbd;B\xef\xbf\xbd\xef\xbf\xbd|\xef\xbf\xbd \xef\xbf\xbd0U,\xef\xbf\xbd\xef\xbf\xbdh\xef\xbf\xbdNS+\xef\xbf\xbd\xef\xbf\xbd.\xef\xbf\xbd\xef\xbf\xbdG\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\n\nres = hash_hmac(\'sha256\', $saltBin, $keyBin);\nresult\n39ddcd6156a30fdcebc9fbf5dd59a0ef4f47e27841bbc12ce72b64a0a63c0324\n
Run Code Online (Sandbox Code Playgroud)\n

冷聚变版本

\n
<cfset res = hmac(saltBin,keyBin,"HMACSHA256")>\nresult\n30A658BEB3965C2D7D27A3F717FB6C13B05ED44E8B2A5A7FEBB9B57887CF57A0\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试过以下解决方案

\n

ColdFusion 相当于 PHP hash_hmac

\n

Coldfusion哈希以及hmacSHA256和SHA256之间的区别

\n

更新:

\n

下面是PHP版本的缩写版本

\n
$key = \'943b421c9eb07c830af81030552c86009268de4e532ba2ee2eab8247c6da0881\';\n$salt = \'520f986b998545b4785e0defbc4f3c1203f22de2374a3d53cb7a7fe9fea309c5\';\n$keyBin = pack("H*" , $key);\n$saltBin = pack("H*" , $salt);\n$path = "/rs:fill:300:300:1/g:no/aHR0cDovL2ltZy5leGFtcGxlLmNvbS9wcmV0dHkvaW1hZ2UuanBn.png";\necho hash_hmac(\'sha256\', $saltBin.$path, $keyBin);\n
Run Code Online (Sandbox Code Playgroud)\n

结果:7062c2b5786c82de963767de4b0cdbc4e7ed7db2ce7466708bf8a28d8572888b

\n

冷聚变版本

\n
<cfset key = \'943b421c9eb07c830af81030552c86009268de4e532ba2ee2eab8247c6da0881\'>\n<cfset salt = \'520f986b998545b4785e0defbc4f3c1203f22de2374a3d53cb7a7fe9fea309c5\'>\n<cfset keyBin = binaryDecode(key, \'hex\')>  \n<cfset keyBin =  toString(keyBin)>\n<cfset saltBin = binaryDecode(salt, \'hex\')>  \n<cfset saltBin =  toString(saltBin)>\n<cfset path =  "/rs:fill:300:300:1/g:no/aHR0cDovL2ltZy5leGFtcGxlLmNvbS9wcmV0dHkvaW1hZ2UuanBn.png">\n<cfset result = hmac(saltBin&path,keyBin,"HMACSHA256")>\n<cfoutput>#result#</cfoutput>\n
Run Code Online (Sandbox Code Playgroud)\n

结果:FFA7A526BB464CA1470F309605F1ED63832342B704F8475BFAF26CCD1092603B

\n

有人可以在这方面帮助我吗?

\n

谢谢。

\n

Age*_*eax 7

\n

两个脚本上的 saltBin 和 keyBin 值相同

\n
\n

是的,这些值是相同的,但散列的数据不同。这就是结果不匹配的原因。

\n

php 代码对salt 和路径变量的连接二进制进行哈希处理。使用简单的值来说明:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n
数据价值二进制Base64
ab[-85]qw==
小路123[49,50,51]MTZ
盐+路径不适用[-85,49,50,51]qzEyMw==
\n
\n

而 CF 代码使用连接字符串salt 和路径的二进制,在使用ToString()进行一些非常......可疑的重新编码之后。正如您所看到的,生成的二进制文件与 php 使用的二进制文件非常不同:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n
数据价值二进制Base64
\xef\xbf\xbd[-17,-65,-67]77+9
小路123[49,50,51]MTZ
盐+路径\xef\xbf\xbd123[-17,-65,-67,49,50,51]77+9MTZ
\n
\n

CF 代码需要连接两个变量的二进制。然后将该二进制文件传递给hmac()函数:

\n

CF(参见可运行示例

\n
<cfscript>\n   key = \'943b421c9eb07c830af81030552c86009268de4e532ba2ee2eab8247c6da0881\';\n   salt = \'520f986b998545b4785e0defbc4f3c1203f22de2374a3d53cb7a7fe9fea309c5\';\n   keyBin =  binaryDecode(key, "hex");\n   saltBin = binaryDecode(salt, "hex");\n   path = "/rs:fill:300:300:1/g:no/aHR0cDovL2ltZy5leGFtcGxlLmNvbS9wcmV0dHkvaW1hZ2UuanBn.png";\n   pathBin = charsetDecode(path, "utf-8");\n\n   // merge binary of salt and path\n   combined = [];\n   combined.append(saltBin, true);\n   combined.append(pathBin, true);\n   result = lcase(hmac( javacast("byte[]", combined),keyBin,"HMACSHA256"));\n   writeDump(result);\n</cfscript>\n
Run Code Online (Sandbox Code Playgroud)\n

结果: 7062c2b5786c82de963767de4b0cdbc4e7ed7db2ce7466708bf8a28d8572888b

\n

PHP(参见可运行示例

\n
<?php\n$key = \'943b421c9eb07c830af81030552c86009268de4e532ba2ee2eab8247c6da0881\';\n$salt = \'520f986b998545b4785e0defbc4f3c1203f22de2374a3d53cb7a7fe9fea309c5\';\n$keyBin = pack("H*" , $key);\n$saltBin = pack("H*" , $salt);\n$path = "/rs:fill:300:300:1/g:no/aHR0cDovL2ltZy5leGFtcGxlLmNvbS9wcmV0dHkvaW1hZ2UuanBn.png";\necho hash_hmac(\'sha256\', $saltBin.$path, $keyBin);\n
Run Code Online (Sandbox Code Playgroud)\n

结果: 7062c2b5786c82de963767de4b0cdbc4e7ed7db2ce7466708bf8a28d8572888b

\n

  • 精彩且解释清楚的答案!值得不止一票赞成! (2认同)