在 C# 中创建消息的哈希

Creating a hash of a message in C#

我想使用需要签名的 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# 代码以重现相同结果,我将不胜感激。

我不知道要更改您提供的代码中的哪些内容。但是让我来指导你。

由于文本编码的原因,您可能有不同的密钥或消息。例如,对于 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