【问题标题】:C# md5 hash not matching node generated md5 hashC# md5 hash 不匹配节点生成的 md5 hash
【发布时间】: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 方法。不要随意更改,尝试了解代码做了什么以及为什么会这样做。例如,您会注意到,如果使用单元素数组,这两种方法会产生相同的结果。这告诉你什么?

标签: c# node.js md5


【解决方案1】:

JavaScripts 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# fiddleJavaScript fiddle)。

【讨论】:

  • 感谢您的帮助 - 我觉得自己像个白痴,但我会留下这个作为证明不要试图在周日早上在家庭出游前匆忙完成某事:) 借口不会帮助,但我无法让节点环境在本地运行以正确调试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多