我需要签署我的amazon产品api请求,接受的代码如下。

base64_encode(hash_hmac('sha256', $request, $key, true));

当我在64位Linux上运行时,这很好,但当我在64位Windows7上运行时,这就失败了。有人知道如何调试为什么hash-hmac在64位linux和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我现在的猜测是,尽管Windows7操作系统是64位的,但由于在php.net站点上找不到64位版本,所以php二进制文件编译为32位。
编辑3我现在很确定问题是二进制文件是32位的。linux上的php很可能使用os版本来计算散列,而windows上的php则实现自己的版本,这导致32/64位的差异,即使两个os都是64位的。

最佳答案

恭喜你,欢迎来到精彩的线尾世界。您遇到的问题是一个典型的问题:nix中的行尾是\n,windows中的行尾是\r\n。请尝试以下操作:

$test = "GET\n".
"webservices.amazon.com\n".
"/onca/xml\n".
"AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06";

08-27 20:10
查看更多