C# md5 哈希不匹配节点生成的 md5 哈希
C# md5 hash not matching node generated md5 hash
我正在尝试生成一个 md5 哈希并将其通过 C# 程序存储为十六进制字符串(与密码无关!),但我需要复制现有的节点方法。当我检查我生成的哈希与节点生成的哈希时,它们不匹配。我怀疑它与编码有关,但我已经尝试过 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();
}
}
JavaScript data?.join()
joins strings with a comma,即 ["Hello", "World"].join()
产生 "Hello,World"
.
在 C# 中,您显式连接不带分隔符的字符串,因此 String.Join("", new[] {"Hello", "World"})
产生 "HelloWorld"
。
如果您将 C# 代码行更改为
var hashInput = String.Join(",", inputs);
两种方法产生相同的结果 (C# fiddle, JavaScript fiddle)。
我正在尝试生成一个 md5 哈希并将其通过 C# 程序存储为十六进制字符串(与密码无关!),但我需要复制现有的节点方法。当我检查我生成的哈希与节点生成的哈希时,它们不匹配。我怀疑它与编码有关,但我已经尝试过 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();
}
}
JavaScript data?.join()
joins strings with a comma,即 ["Hello", "World"].join()
产生 "Hello,World"
.
在 C# 中,您显式连接不带分隔符的字符串,因此 String.Join("", new[] {"Hello", "World"})
产生 "HelloWorld"
。
如果您将 C# 代码行更改为
var hashInput = String.Join(",", inputs);
两种方法产生相同的结果 (C# fiddle, JavaScript fiddle)。