C#vs PHP - 它们返回不同的HMACSHA256

时间:2014-02-07 09:27:18

标签: c# php .net hash hmac

这是我的PHP代码:

<?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));
}

但它会重新调整p5GK7FCRmRXzzv7YYi3b41RIyPcaVK0RWCjwegWTD0w=

为什么两个不同的结果? C#代码有什么问题?

2 个答案:

答案 0 :(得分:4)

PHP以十六进制编码结果,c#编码base64中的结果。但是都是一样的。

更改此行:

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

对此:

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

以十六进制编码结果。

答案 1 :(得分:3)

他们是一样的:

.NET C#的结果是p5GK7FCRmRXzzv7YYi3b41RIyPcaVK0RWCjwegWTD0w=。这是一个base64字符串。

例如,您可以使用this tool将其转换为十六进制。转换后你会得到与PHP相同的东西:

A7918AEC50919915F3CEFED8622DDBE35448C8F71A54AD115828F07A05930F4C