2014-03-04 72 views
3

我在與hash_hmac和AWS簽名版本4個問題我使用他們奠定了這裏的例子:http://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.htmlPHP hash_hmac不匹配AWS簽名4例如

輸出是從AWS網站。我想匹配它,我似乎無法看到我做錯了什麼。他們想要二進制輸出,這就是我在每一步提供的。

這裏是我的測試文件:

<?php 

// wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY 
// HMAC(HMAC(HMAC(HMAC("AWS4" + kSecret,"20110909"),"us-east-1"),"iam"),"aws4_request") 

$sign = hash_hmac('sha256', 'AWS4wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY', '20110909', true); 
$sign = hash_hmac('sha256', $sign, 'us-east-1', true); 
$sign = hash_hmac('sha256', $sign, 'iam', true); 
$sign = hash_hmac('sha256', $sign, 'aws4_request', true); 
$sign = str_split($sign); 

echo "152 241 216 137 254 196 244 66 26 220 82 43 171 12 225 248 46 105 41 194 98 237 21 229 169 76 144 239 209 227 176 231\n"; 

foreach($sign as $t) 
    echo ord($t) . ' '; 
+0

如果更改函數中參數的順序,則會得到相同的結果,並且是正確的。 – user3377141

回答

2

正確的格式是反向:

<?php 

// wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY 
// HMAC(HMAC(HMAC(HMAC("AWS4" + kSecret,"20110909"),"us-east-1"),"iam"),"aws4_request") 

$sign = hash_hmac('sha256', '20110909', 'AWS4wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY', true); 
$sign = hash_hmac('sha256', 'us-east-1', $sign, true); 
$sign = hash_hmac('sha256', 'iam', $sign, true); 
$sign = hash_hmac('sha256', 'aws4_request', $sign, true); 
$sign = str_split($sign); 

echo "152 241 216 137 254 196 244 66 26 220 82 43 171 12 225 248 46 105 41 194 98 237 21 229 169 76 144 239 209 227 176 231\n"; 

foreach($sign as $t) 
    echo ord($t) . ' '; 

這給定的字符串匹配的精美。希望這可以幫助別人!

+0

適用於PHP的AWS開發工具包的相關部分位於此處:https://github.com/aws/aws-sdk-php/blob/master/src/Aws/Common/Signature/SignatureV4.php#L254-L257 –

+0

你好,謝謝你的回答,它工作。但是當我把它連接到我的瀏覽器上傳腳本時,我仍然發現問題。你可以看看我的帖子在這裏:http://stackoverflow.com/questions/28491237/amazon-aws-s3-browser-upload-on-php-aws-signature-version-4並分享你的見解嗎? – jaycode