【问题标题】:Coldfusion pack(H* equivalentColdfusion包(H*当量
【发布时间】:2017-05-18 01:04:45
【问题描述】:

我正在尝试在coldfusion 中模拟一个php 函数。以下的 PHP 输出;

<?php echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', pack('H*','specialkey')))); ?>

E9C9E66592306F1BD27A3B1991C7650D4A8920D10E5FFDA955DA692225793F35 中的结果

在 CF 中尝试时

<cfset z=hmac("a cow jumps over the moom", "specialkey","HMACSHA256")>

结果是1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF

显然和pack(H*部分有关,好像我跑了

<?php echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', 'specialkey'))); ?>

结果是 1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF

如何在 php 中模拟 pack(H*?我需要在 CF 中返回结果E9C9E66592306F1BD27A3B1991C7650D4A8920D10E5FFDA955DA692225793F35

【问题讨论】:

  • 如果您不共享任何代码,我们将无法帮助您。
  • 您需要告诉我们您要打包的what 的数据类型。 “H*”部分是how。说清楚:pack(how, what)
  • 抱歉,这是您的意思吗?
  • 我的 CF 代码是 。它产生 1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF 如果我在没有包的情况下运行 php 函数(H 部分我得到相同的结果。我只是把头发拉到包上(H 位

标签: php coldfusion


【解决方案1】:

虽然看起来双方都使用相同的密钥 - 但事实并非如此。

为了生成 HMAC,PHP 和 CF 都必须首先将值解码为 二进制,而该值就是实际用作“键”的值。您得到不同结果的原因是双方对键值的解码方式不同:PHP 使用 JVM 默认值(即 UTF-8、ASCII 等)将其从 hexadecimal 和 CF 解码为纯字符串。结果,PHP 和 CF 生成完全不同的密钥,这就是 HMAC 代码不匹配的原因。

话虽如此,我注意到您的键值“specialkey”实际上不是有效的十六进制字符串。所以在你花很多时间在这之前,我的问题是 PHP 代码 真的 使用像“specialkey”这样的任意字符串还是只是为了测试目的?如果实际代码使用有效的十六进制字符串,那么只需将 binary 键传递给 CF 的 HMAC 函数,结果应该是相同的:

ColdFusion:

writeOutput( hmac("a cow jumps over the moom"
            , binaryDecode("7370656369616c6b6579", "hex")
            , "HMACSHA256"));

PHP:

echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', pack('H*','7370656369616c6b6579'))));

结果:

1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF

更新:如果出于某种原因您确实需要使用任意字符串作为键,请查看Perl docs for pack(PHP 函数所基于的)。

免责声明:我不是真正的 PHP 人,所以还有更多内容,但是...基本上pack(H*) 将您的密钥字符串分解为成对的字符并将它们解释为十六进制。将“s”、“p”、“i”等无效字符转换为 null 或 0:

  sp   --> 00  ("s" and "p" are invalid)
  ec   --> EC  ("e" and "c" are valid hex)
  ia   --> 0A  ("i" is invalid, "a" is valid)
  lk   --> 00  ("l" and "k" are both invalid)
  ey   --> E0  ("e" is valid, "y" is invalid)

生成的二进制文件是这样的(十六进制):

00 EC 0A 00 E0

如果您将该十六进制字符串解码回二进制并将其用作密钥:

hmac("a cow jumps over the moom", binaryDecode("00EC0A00E0", "hex"), "HMACSHA256")

CF 返回与 PHP 相同的结果:

E9C9E66592306F1BD27A3B1991C7650D4A8920D10E5FFDA955DA692225793F35

【讨论】:

  • 谢谢,我省略了 binaryDecode("00EC0A00E0", "hex"),特殊密钥只是一个测试密钥。非常感谢
猜你喜欢
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多