gpt4 book ai didi

PHP hash_hmac() 操作系统差异

转载 作者:可可西里 更新时间:2023-11-01 11:39:26 26 4
gpt4 key购买 nike

我需要签署我的亚马逊产品 API 请求,接受的代码如下。

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

这在我使用 64 位 Linux 时效果很好,但在使用 64 位 Windows 7 时失败了。有没有人知道如何调试为什么 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=

The non-base64-encoded values are 5f451372df57489ff793682eea7a322a14e592cc7965b1f8a806c2c96df35f8f for the incorrect and 35a71ef94dc0cf83a137bb484aa82cd6f74b0470448a359c05e0aa2f9c4df718 for the correct one when converted to hex. (它是调用中的原始二进制输出)

编辑 2 我现在的猜测是,即使 Windows 7 操作系统是 64 位,PHP 二进制文件也被编译为 32 位,因为我在 php.net 网站上找不到 64 位版本。

编辑 3 实际上我现在很确定问题是二进制文件是 32 位的。 Linux 上的 PHP 很可能使用操作系统版本来计算哈希,而 Windows 上的 PHP 实现了它自己的版本,这导致了 32/64 位差异,即使两个操作系统都是 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";

关于PHP hash_hmac() 操作系统差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3949599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com