我需要c#等效的以下nodejs代码。我有一些c#代码,但结果不一样。
//下面的工作节点代码
Ice3x.prototype._signMessage = function (message) {
var hmac = crypto.createHmac('sha512',new Buffer(this.secret, 'base64'));
hmac.update(message);
var signature = hmac.digest('base64');
return signature;
}
// c#code under
public class HmacSignatureCalculator : ICalculteSignature
{
public string Signature(string secret, string value)
{
var secretBytes = Encoding.UTF8.GetBytes(secret);
var valueBytes = Encoding.UTF8.GetBytes(value);
string signature;
using (var hmac = new HMACSHA512(secretBytes))
{
var hash = hmac.ComputeHash(valueBytes);
signature = Convert.ToBase64String(hash);
}
return signature;
}
}
答案 0 :(得分:2)
看起来差异来自秘密的编码方式。在节点版本中,它假定它表示base64编码的字节数组,而在C#版本中,您将其视为普通字符串。
因此,在您的C#版本中,从基本64位编码的密码中读取字节数组:
var secretBytes = Convert.FromBase64String(secret);
现在,您与节点版本保持一致:
var hmac = crypto.createHmac('sha512', new Buffer(this.secret, 'base64'));