php-Coldfusion pack(相当于H *
作者:互联网
我试图在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中模拟包(H *?我需要在CF中返回结果E9C9E66592306F1BD27A3B1991C7650D4A8920D10E5FFDA955DA692225793F35吗?
解决方法:
尽管看起来双方都在使用相同的密钥-但事实并非如此.
为了生成HMAC,PHP和CF都必须首先将值解码为二进制,并且该值实际上是用作“密钥”的值.得到不同结果的原因是,双方对密钥值的解码方式不同:PHP使用JVM默认值(即UTF-8,ASCII等)从hexadecimal和CF将其解码为纯字符串.结果,PHP和CF生成完全不同的密钥,这就是HMAC代码不匹配的原因.
话虽如此,我注意到您的键值“ specialkey”实际上不是有效的十六进制字符串.因此,在花费大量时间之前,我的问题是PHP代码是否真的使用诸如“ specialkey”之类的任意字符串,还是仅出于测试目的?如果实际代码使用有效的十六进制字符串,则只需将二进制密钥传递给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
标签:coldfusion,php 来源: https://codeday.me/bug/20191026/1936094.html