我需要签署我的亚马逊产品API请求,接受的代码如下。PHP hash_hmac()操作系统区别
base64_encode(hash_hmac('sha256', $request, $key, true));
,当我在64位Linux,但,当我在64位Windows 7有没有人有任何想法如何调试为什么hash_hmac提供64位版和64位Windows之间的不同输出失败这个伟大的工程?
测试代码:
<?php
$test = "GET
webservices.amazon.com
/onca/xml
AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06";
#echo $test;
echo base64_encode(hash_hmac('sha256', $test, '1234567890', true));
编辑上面的代码的正确的输出是Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=
不正确的输出是X0UTct9XSJ/3k2gu6noyKhTlksx5ZbH4qAbCyW3zX48=
非base64编码值是5f451372df57489ff793682eea7a322a14e592cc7965b1f8a806c2c96df35f8f
为不正确的和35a71ef94dc0cf83a137bb484aa82cd6f74b0470448a359c05e0aa2f9c4df718
对于正确的转换为十六进制。 (这是在调用原始的二进制输出)
编辑2我的猜测现在的问题是,即使Windows 7操作系统是64位的PHP二进制文件编译为32位,因为我无法找到关于PHP的64位版本。网站。
编辑3我其实很确定现在问题是二进制是32位。很可能,Linux上的PHP使用操作系统版本来计算哈希值,而Windows上的PHP实现它自己的版本,即使两个操作系统都是64位,也会导致32/64位的差异。
它可能有助于给我们不正确的输出以及... – 2010-10-16 16:20:27
我做了大约10分钟之前,你评论说?... – 2010-10-16 16:29:28
@Martin:我也只看到正确的输出。你能包含来自Linux和Windows系统的输出吗? – 2010-10-16 16:46:54