在C#

时间:2019-01-13 15:41:20

标签: javascript c# sha256 hmac

我想使用需要签名的REST API,这是使用秘密密钥的消息的哈希。我有一个可以实现的JavaScript实现,但是当我尝试在C#中执行相同的操作时,它会产生不同的结果,根据API响应,这似乎是不正确的。

产生所需签名的JavaScript代码:

let signature = crypto.createHmac('sha256', secret_key).update(message).digest('hex');

不会产生所需签名的C#代码:

var hash = new HMACSHA256(key);
byte[] signature = hash.ComputeHash(message);
StringBuilder hexDigest = new StringBuilder();
foreach (byte b in signature)
     hexDigest.Append(String.Format("{0:x2}", b).ToUpper());

如果有人可以告诉我,为了重现相同的结果,我需要在C#代码中进行哪些更改,我们将不胜感激。

1 个答案:

答案 0 :(得分:2)

我不知道您提供的代码中要进行哪些更改。但是,让我指导您。

由于文本编码,您可能具有不同的键或消息。例如,使用Javascript我尝试了以下代码:

const secret_key = 'abcdefg';
const message = 'Hello, World!';
let signature = crypto.createHmac('sha256', secret_key).update(message).digest('hex');

signature37c559140f3c04743337019ef0f693ee8a469c9d41a925b8f3b624796dce0ba0

在C#中,我使用了UTF8编码,并得到了相同的结果。

var key = Encoding.UTF8.GetBytes("abcdefg");
var hash = new HMACSHA256(key);
var message = Encoding.UTF8.GetBytes("Hello, World!");
byte[] signature = hash.ComputeHash(message);
    StringBuilder hexDigest = new StringBuilder();
    foreach (byte b in signature)
         hexDigest.Append(String.Format("{0:x2}", b));

如果我使用Encoding.Unicode,则会得到不同的签名eb2b452cf518dc647a5014b7dd46da2e7bd2300aae394ea9cbb4eba492c093f5