对如何在C#NET中实现来自javascript的HMACSHA1感到困惑

对如何在C#NET中实现来自javascript的HMACSHA1感到困惑,javascript,c#,.net,Javascript,C#,.net,我正在使用crypto js库为我的javascript代码实现HMACSHA1 代码如下所示 const hash1 = require("crypto-js"); let signature = "application_id=3610&auth_key=aDRceQyTXSYEdJU&nonce=6304033672&timestamp=1623098533&user[login]=john@mail.com&user

我正在使用crypto js库为我的javascript代码实现HMACSHA1

代码如下所示

const hash1 = require("crypto-js");

let signature = "application_id=3610&auth_key=aDRceQyTXSYEdJU&nonce=6304033672&timestamp=1623098533&user[login]=john@mail.com&user[password]=123456789"

let key = "dBV2PdhYMnruSMb"
let hash = hash1.HmacSHA1(signature, key).toString()

console.log(hash)

//which prints 
467280c4cb82fc97bd04c51d8a846446ad6e82e1
这在javascript中显然非常简单。但后来我尝试使用相同的字符串和c#中的键,它打印出一个完全不同的字符串。我迷路了,不知道如何解决这个问题

下面是我在C中实现这一点的尝试#


我不确定我在这里做错了什么,我的C#实现正确吗?

你的
键不同。crypto js需要一个字符串,而C#需要一个字节数组。您不应该使用
FromBase64String()
,而应该使用
Encoding.UTF8.GetBytes()
。正如@jps在评论中提到的那样


当然,这是不同的,您的JS实现有一个十六进制编码 输出,但在C#实现中,您是base64编码 结果

您应该将字节数组转换为十六进制字符串,如下所示

string signSession = "application_id=3610&auth_key=aDRceQyTXSYEdJU&nonce=6304033672&timestamp=1623098533&user[login]=john@mail.com&user[password]=123456789";

string key = "dBV2PdhYMnruSMb";

//convert the session signature string to a byte array
byte[] signature = Encoding.UTF8.GetBytes(signSession);

var apiKey = Encoding.UTF8.GetBytes(key);

//Generate a HMACSHA1 signature
using (HMACSHA1 hmac = new HMACSHA1(apiKey))
{
    byte[] signatureBytes = hmac.ComputeHash(signature);
    string hexSignature = BitConverter.ToString(signatureBytes).ToLowerInvariant().Replace("-", "");
    Console.WriteLine(hexSignature);
    session.Signature = hexSignature;
}

当然不同,JS实现有一个十六进制编码的输出,但在C#实现中,您是base64编码的结果。在JS中,您直接传递密钥,而在C#中,您是base64解码的。谢谢!你救了我几个小时的命。我要花很长时间才能弄明白。有时候javascript让事情变得太简单了。
string signSession = "application_id=3610&auth_key=aDRceQyTXSYEdJU&nonce=6304033672&timestamp=1623098533&user[login]=john@mail.com&user[password]=123456789";

string key = "dBV2PdhYMnruSMb";

//convert the session signature string to a byte array
byte[] signature = Encoding.UTF8.GetBytes(signSession);

var apiKey = Encoding.UTF8.GetBytes(key);

//Generate a HMACSHA1 signature
using (HMACSHA1 hmac = new HMACSHA1(apiKey))
{
    byte[] signatureBytes = hmac.ComputeHash(signature);
    string hexSignature = BitConverter.ToString(signatureBytes).ToLowerInvariant().Replace("-", "");
    Console.WriteLine(hexSignature);
    session.Signature = hexSignature;
}