我有一个简单的 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));
}
}
}
我从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# 中,您可以使用 GetBytes
从 System.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/