Php Coldfusion组件(H*等效物

Php Coldfusion组件(H*等效物,php,coldfusion,Php,Coldfusion,我试图在coldfusion中模拟一个php函数 <?php echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', pack('H*','specialkey')))); ?> 结果是1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF 这显然与pack(H*部分有关,就好像我在运行一样 <?php echo (strtou

我试图在coldfusion中模拟一个php函数

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

这显然与
pack(H*
部分有关,就好像我在运行一样

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

结果是
1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF


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

尽管看起来双方使用的是同一个键,但事实并非如此

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

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

ColdFusion:

writeOutput( hmac("a cow jumps over the moom"
            , binaryDecode("7370656369616c6b6579", "hex")
            , "HMACSHA256"));
echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', pack('H*','7370656369616c6b6579'))));
1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF
PHP:

writeOutput( hmac("a cow jumps over the moom"
            , binaryDecode("7370656369616c6b6579", "hex")
            , "HMACSHA256"));
echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', pack('H*','7370656369616c6b6579'))));
1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF
结果:

writeOutput( hmac("a cow jumps over the moom"
            , binaryDecode("7370656369616c6b6579", "hex")
            , "HMACSHA256"));
echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', pack('H*','7370656369616c6b6579'))));
1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF

更新:如果出于某种原因确实需要使用任意字符串作为键,请查看(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)
生成的二进制文件如下(十六进制):

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

hmac("a cow jumps over the moom", binaryDecode("00EC0A00E0", "hex"), "HMACSHA256")
CF返回与PHP相同的结果:

E9C9E66592306F1BD27A3B1991C7650D4A8920D10E5FFDA955DA692225793F35

如果您不共享任何代码,我们将无法帮助您。您需要告诉我们您尝试打包的
内容的数据类型。“H*”部分是
如何
。要澄清:
打包(如何,什么)
对不起,这就是你的意思吗?我的CF代码就是。如果我在没有包的情况下运行php函数,它会生成1A905E37DC5F75444E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF(H部分我得到了相同的结果。我只是在包上做了些手脚(谢谢,我省略了二进制解码(“00EC0A00E0”,“十六进制”),这把特殊的钥匙只是一把测试钥匙。非常感谢