【问题标题】:Creating a hash of a message in C#在 C# 中创建消息的哈希
【发布时间】:2019-01-14 00:24:18
【问题描述】:

我想使用需要签名的 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 c# sha256 hmac


    【解决方案1】:

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

    由于文本编码,您可能有不同的键或消息。例如,使用 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

    【讨论】:

    • 感谢您指出这一点,它实际上让我重新考虑了输入的值。问题是,消息必须是 base64 编码的 json,当我比较消息时,它似乎是相同的,但实际上,正如我现在检查的那样,它们并不是完全相同的字符串,这通过查看不容易注意到它。我有一个不同顺序的 json 属性。我非常确信哈希有问题,因为它有多个步骤。
    猜你喜欢
    • 2011-09-20
    • 2018-07-17
    • 2012-11-20
    • 2013-12-20
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    相关资源
    最近更新 更多