c#创建的md5sum和bash的区别

Difference between md5sum created by c# and bash

我正在尝试理解为什么当我使用 linux md5sum 函数时,如下所示:

#!/bin/bash
p="4c4712a4141d261ec0ca8f90379"
Etime="123456"
TOTP=$(echo $Etime$p|md5sum|cut -f1 -d' ')
echo $TOTP

我有:ce007ddfb5eb0ccda6d4a6ddd631c563

但是当我尝试使用以下代码在 C# 中生成 md5sum 时:

        public static string Hash()
        {
            string p = "4c4712a4141d261ec0ca8f90379";
            string Etime = "123456";
            string h = Etime + p ;
            string r = md5test(h);
            return r;
        }

        public static string md5test(string testString)
        {
            byte[] asciiBytes = ASCIIEncoding.UTF8.GetBytes(testString);
            byte[] hashedBytes = MD5CryptoServiceProvider.Create().ComputeHash(asciiBytes);
            string hashedString = BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
            return hashedString;
        }

我有不同的值:acb6242ab9ad7a969fb27f10644a0283

我认为问题在于将字节转换为字符串,但我不确定。 有谁能解释我在哪里犯了错误或如何做才能达到预期 value:ce007ddfb5eb0ccda6d4a6ddd631c563

谢谢 沃伊泰克

问题是 echo 输出末尾的换行符。使用 echo -nprintf 代替:

TOTP=$(printf %s "$Etime$p" | md5sum | cut -f1 -d' ')

我重写了你测试的bash部分:

printf '1234564c4712a4141d261ec0ca8f90379' | md5sum
# prints: acb6242ab9ad7a969fb27f10644a0283  -

printf '1234564c4712a4141d261ec0ca8f90379\n' | md5sum
# prints: ce007ddfb5eb0ccda6d4a6ddd631c563  -

不同的是,echo 追加一个换行符。一种解决方案是使用带有选项 -n 的 echo:echo -n ...。更好的解决方案是使用 printf 而不是 echo:printf %s%s' "$Etime" "$p"