javascript - Node.js 中的 SHA512HMAC 与 C# 不匹配

标签 javascript c# node.js

我有一个简单的 Node.js 脚本

var text = "Hello!";
var serverSeed = "d8818b38a14e7461e87301ad4b9809b558bcbca816b650cd470452e018ada255";
var crypto = require('crypto');
var hash = crypto.createHmac('sha512', serverSeed).update(text).digest('hex');
console.log(hash);

我还有C#程序

using System;
using System.Text;
using System.Security.Cryptography;

public class Program
{
    public static byte[] StringToByteArray(String hex)
    {
        int NumberChars = hex.Length;
        byte[] bytes = new byte[NumberChars / 2];
        for (int i = 0; i < NumberChars; i += 2)
            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
        return bytes;
    }
    public static string ByteArrayToString(byte[] ba)
    {
        StringBuilder hex = new StringBuilder(ba.Length * 2);
        foreach (byte b in ba)
            hex.AppendFormat("{0:x2}", b);
        return hex.ToString();
    }

    public static void Main()
    {

        var serverSeed = StringToByteArray("d8818b38a14e7461e87301ad4b9809b558bcbca816b650cd470452e018ada255");
        using (var sha = new HMACSHA512(serverSeed))
        {
            var hash = sha.ComputeHash(Encoding.ASCII.GetBytes("Hello!"));
            Console.WriteLine(ByteArrayToString(hash));
        }
    }
}

( runable version here )

我从node.js程序获取

99e3b20acaa9c7674f074da950945ee897876b0afc02121d5a89fa581081465f3e01a084e9b05bed729b7fbdc1d485fb38af7d6f501cbc258b6c66add54410ba

以及来自 C# 程序

73250817a927f394b0912afcece47b8c12aeaed31892c64116ae9dd0d407f6e31d5c062d65f68a3cae09a8acb14a7cef1f6afd99f5a22f2b73e46a991fcd079a

我做错了什么导致了这种差异?

最佳答案

您的 C# 代码正在根据字符以十六进制格式表示的内容将种子中的十六进制字符转换为字节数组。

但是您的 Node 代码将种子作为字符串传递,该字符串将字符转换为字节。

例如,您的 C# 代码将 a 转换为值为 10 的字节,但您的 Node 代码会将 a 转换为值为 97 的字节

您的 Node 代码需要根据十六进制值将字符串中的十六进制转换为缓冲区,就像在 C# 中所做的那样。

var text = "Hello!";
var serverSeed = "d8818b38a14e7461e87301ad4b9809b558bcbca816b650cd470452e018ada255";
var crypto = require('crypto');
var buff = new Buffer(seed, "hex")
var hash = crypto.createHmac('sha512', buff).update(text).digest('hex');
console.log(hash);

或者在 C# 中,您可以使用 GetBytesSystem.Text.Encoding 实例获取表示种子实际字符的字节数组,而不是将十六进制转换为字节。

 var serverSeed = Encoding.ASCII.GetBytes("d8818b38a14e7461e87301ad4b9809b558bcbca816b650cd470452e018ada255");
    using (var sha = new HMACSHA512(serverSeed))
    {
        var hash = sha.ComputeHash(Encoding.ASCII.GetBytes("Hello!"));
        Console.WriteLine(ByteArrayToString(hash));
    }

您很可能打算将 serverSeed 作为 Node.js 代码中的缓冲区传递。

关于javascript - Node.js 中的 SHA512HMAC 与 C# 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44866163/

相关文章:

javascript - AngularJS:从 Controller 函数绑定(bind)属性值

javascript - 将angular模板编译成html的正确方法,将结果转换成字符串

c# - 从 ASP.NET 应用程序连接到 AWS MySql 数据库时访问被拒绝

node.js - 如何为子文档创建 mongoDb 模式

javascript - Socket.io 1.x + Express(使用http): How to send messages to specific client id?

javascript - 如何将 .each 调用的返回值保存到数组中

c# - 免费的 UML 工具,非常适合 .NET

c# - Json.Net 从 JObject 循环更改为 JArray

django - 服务器对象(Socket.io)中没有配置方法

javascript - 无法读取未定义 ReactJS 的属性 'setState'