如何计算像 MD5(str1+ MD5(str2+ str3)) 这样的散列

How to compute hash like MD5(str1+ MD5(str2+ str3))

我需要加密凭据才能连接到远程服务器。 从我找到的文档中,密码需要像下面显示的那样被散列。

MD5(session + MD5(username+ password))

但是我无法从 C# 获得相同的散列密码,就像从 WebClient 发送到服务器一样。

我尝试了几种组合,其中 none 给了我相同的结果。 这是我最后的方法。

string EncryptPassword(string UserName, string Password, string SessionId)
        {
            // Password is MD5(sessionId + MD5(login + password))
            // Source: https://www.godo.dev/tutorials/csharp-md5/
            using (MD5 md5 = MD5.Create())
            {

                string credentials = $"{UserName}{Password}";
                // Hash credentials first
                md5.ComputeHash(Encoding.UTF8.GetBytes(credentials));
                var inputBuffer = Encoding.UTF8.GetBytes(SessionId).ToList();
                inputBuffer.AddRange(md5.Hash);
                //var inputBuffer = Encoding.UTF8.GetBytes(SessionId + credentialBuilder.ToString());

                md5.ComputeHash(inputBuffer.ToArray());

                //md5.TransformBlock(inputBuffer, 0, inputBuffer.Length, inputBuffer, 0);
                //md5.TransformFinalBlock(new byte[0], 0, 0);

                // Get hash result after compute it  
                byte[] hashedCredentials = md5
                    .Hash;

                StringBuilder strBuilder = new StringBuilder();
                for (int i = 0; i < hashedCredentials.Length; i++)
                {
                    //change it into 2 hexadecimal digits  
                    //for each byte  
                    strBuilder.Append(hashedCredentials[i].ToString("x2"));
                }
                return strBuilder.ToString();
            }
        }

我尝试使用以下测试凭据: 用户名:

login: TestUser
password: TestPassword
session: uu2cO7b7drhxHKItfRpcJ4#qk@230#$R

有效结果:4dfb147da0d2338cb57e05d1b4b21d07 <= 上面的信息应该是这样的。

我的结果:eb55ef7e70c160ad2dd8fe831a1cf708

您的结果要求您使用 UserNamePassword 的文本(十六进制)哈希结果,而您使用的是字节结果。

如果替换:

inputBuffer.AddRange(md5.Hash);

与:

string hexHash = BitConverter.ToString(md5.Hash).Replace("-", string.Empty).ToLowerInvariant();
inputBuffer.AddRange(Encoding.UTF8.GetBytes(hexHash));

Try it online

P.S。如果您使用的是 .NET Core 或 .NET 5,Microsoft 建议不要使用 SecureString 进行新开发。 Source

P.P.S。如果您控制此交易的两端(创建和验证哈希),我建议更改您处理用户名和密码部分的方式,因为以下将在第一步中产生相同的哈希:

Username: bob     Password: bythechickenshed
Username: bobby   Password: thechickenshed