2014-02-07 35 views
0

這是我的PHP代碼:C#與PHP - 他們返回不同HMACSHA256

<?php 
    $sig_string = "GET&https%3A%2F%2Fapi.pinterest.com%2Fv3%2Fusers%2Farchimede%2Fboards%2F&client_id=987654&timestamp=1391761866"; 
    $secret = "123456"; 
    $sig = hash_hmac("sha256", $sig_string, $secret); 
    echo $sig; 
?> 

返回(正確)a7918aec50919915f3cefed8622ddbe35448c8f71a54ad115828f07a05930f4c

現在,我想翻譯的內部C#此功能。代碼:

signature_base_string = "GET&https%3A%2F%2Fapi.pinterest.com%2Fv3%2Fusers%2Farchimede%2Fboards%2F&client_id=987654&timestamp=1391761866"; 
signing_key = "123456"; 
var encoding = new System.Text.ASCIIEncoding(); 
byte[] keyByte = encoding.GetBytes(signing_key); 
byte[] messageBytes = encoding.GetBytes(signature_base_string); 
using (var hmacsha256 = new HMACSHA256(keyByte)) 
{ 
    byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); 
    Response.Write(Convert.ToBase64String(hashmessage)); 
} 

但retuns p5GK7FCRmRXzzv7YYi3b41RIyPcaVK0RWCjwegWTD0w=

爲什麼兩種不同的結果? C#代碼有什麼錯誤?

回答

4

PHP編碼的結果以十六進制和C#編碼以base64。但是一樣。

改變這一行:

Response.Write(Convert.ToBase64String(hashmessage)); 

要這樣:

Response.Write(BitConverter.ToString(hashmessage).Replace("-", "").ToLower()); 

有結果以十六進制編碼。

3

它們是相同的:

從.NET C#的結果是p5GK7FCRmRXzzv7YYi3b41RIyPcaVK0RWCjwegWTD0w=。這是一個base64字符串。

例如,您可以使用this tool將其轉換爲十六進制。你會轉換後得到一樣的PHP:

A7918AEC50919915F3CEFED8622DDBE35448C8F71A54AD115828F07A05930F4C

+0

那麼,我該如何轉換爲十六進制? – markzzz

+0

http://stackoverflow.com/a/311179/1852787 –