【发布时间】:2021-10-17 05:05:47
【问题描述】:
我正在尝试通过 C# 程序生成 md5 哈希并将其存储为十六进制字符串(与密码无关!),但我需要复制现有的节点方法。当我检查我生成的哈希值与节点生成的哈希值时,它们不匹配。我怀疑它与编码有关,但我已经尝试过 UTF8 和 ASCII 并且运气不佳。任何帮助表示赞赏。
节点方法如下:
public static hash(...data: string[]): string {
var md5sum = createHash('md5');
md5sum.update(data?.join() ?? '');
var hash = md5sum.digest('hex');
return hash;
}
C#方法
public static string CalculateHash(string[] inputs)
{
var hashInput = String.Join("", inputs);
using (var md5 = System.Security.Cryptography.MD5.Create())
{
byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(hashInput);
byte[] hashBytes = md5.ComputeHash(inputBytes);
var sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("x2"));
}
return sb.ToString();
}
}
【问题讨论】:
-
看起来不错。你的输入输出是什么?
-
基本上加密散列适用于字节,而不是文本。很清楚您是如何从 .NET 中的文本导出字节到哈希的 - 您知道 Node 代码使用什么吗?
-
“我怀疑它与编码有关,但我尝试了 UTF8 和 ASCII,但运气不佳” 这称为 shotgun debugging。它可以工作,但它很乏味,老实说,有点不专业。我建议改用 methodic 方法。不要随意更改,尝试了解代码做了什么以及为什么会这样做。例如,您会注意到,如果使用单元素数组,这两种方法会产生相同的结果。这告诉你什么?