【问题标题】:Unable to match results of php hash_hmac() and coldfusion hmac()无法匹配 php hash_hmac() 和 Coldfusion hmac() 的结果
【发布时间】:2022-05-13 05:43:26
【问题描述】:

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

PHP版本

$saltBin = R�k��E�x^ �O<�-�7J=S�z��� �;
$keyBin = �;B��|� �0U,��h�NS+��.��G���

res = hash_hmac(\'sha256\', $saltBin, $keyBin);
result
39ddcd6156a30fdcebc9fbf5dd59a0ef4f47e27841bbc12ce72b64a0a63c0324

冷融合版

<cfset res = hmac(saltBin,keyBin,\"HMACSHA256\")>
result
30A658BEB3965C2D7D27A3F717FB6C13B05ED44E8B2A5A7FEBB9B57887CF57A0

我尝试了以下解决方案

ColdFusion equivalent to PHP hash_hmac

coldfusion hashing and difference between hmacSHA256 and SHA256

更新:

以下是PHP version 的缩写版本

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

结果:7062c2b5786c82de963767de4b0cdbc4e7ed7db2ce7466708bf8a28d8572888b

ColdFusion version

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

结果:FFA7A526BB464CA1470F309605F1ED63832342B704F8475BFAF26CCD1092603B

任何人都可以在这方面帮助我吗?

谢谢。

  • 我们需要查看显示$saltBin$keyBin 实际填充方式的代码。此外,在处理二进制文件时,最好将值发布为 base64 编码字符串base64_encode$saltBin$keyBin 的 base64 编码值是什么?
  • @SOS 我在问题末尾的链接中添加了完整的脚本。请检查。
  • 不知道为什么有人投票结束这个问题为“寻求书籍、工具、软件库等的建议”。它显然是关于特定的代码问题,并提供了代码示例和结果。

标签: php hash coldfusion sha256


【解决方案1】:

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

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

php代码散列连接的二进制盐和路径变量。用一个简单的值来说明:

Data Value Binary Base64
Salt ab [-85] qw==
Path 123 [49,50,51] MTIz
Salt + Path n/a [-85,49,50,51] qzEyMw==

而 CF 代码使用连接的二进制字符串盐和路径,经过一些非常......可疑的重新编码ToString()。如您所见,生成的二进制文件与 php 使用的二进制文件大不相同:

Data Value Binary Base64
Salt [-17,-65,-67] 77+9
Path 123 [49,50,51] MTIz
Salt + Path �123 [-17,-65,-67,49,50,51] 77+9MTIz

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

CF(见runnable example

<cfscript>
   key = '943b421c9eb07c830af81030552c86009268de4e532ba2ee2eab8247c6da0881';
   salt = '520f986b998545b4785e0defbc4f3c1203f22de2374a3d53cb7a7fe9fea309c5';
   keyBin =  binaryDecode(key, "hex");
   saltBin = binaryDecode(salt, "hex");
   path = "/rs:fill:300:300:1/g:no/aHR0cDovL2ltZy5leGFtcGxlLmNvbS9wcmV0dHkvaW1hZ2UuanBn.png";
   pathBin = charsetDecode(path, "utf-8");

   // merge binary of salt and path
   combined = [];
   combined.append(saltBin, true);
   combined.append(pathBin, true);
   result = lcase(hmac( javacast("byte[]", combined),keyBin,"HMACSHA256"));
   writeDump(result);
</cfscript>

结果:7062c2b5786c82de963767de4b0cdbc4e7ed7db2ce7466708bf8a28d8572888b

PHP(见runnable example

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

结果:7062c2b5786c82de963767de4b0cdbc4e7ed7db2ce7466708bf8a28d8572888b

【讨论】:

  • 精彩且解释清楚的答案!值得一票以上!
  • @SOS 非常感谢。您节省了我的时间和精力并解决了问题。很好的解释和精彩的答案。我已经应用了你的解决方案,它就像一个魅力。伟大的!!!
猜你喜欢
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2018-04-25
  • 1970-01-01
相关资源
最近更新 更多