我需要簽署我的亞馬遜產品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