【问题标题】:How to compute hash like MD5(str1+ MD5(str2+ str3))如何计算像 MD5(str1+ MD5(str2+ str3)) 这样的哈希值
【发布时间】:2021-07-17 11:37:06
【问题描述】:

我需要加密凭据才能连接到远程服务器。 从我发现的文档中,需要对密码进行哈希处理,如下所示。

MD5(session + MD5(username+ password))

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

我尝试了几种组合,但没有一个给我相同的结果。 这是我最后的方法。

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

【问题讨论】:

  • 什么是SecureStringHelper.ConvertToString(Password)?问题应包含可以直接测试的minimal reproducible example
  • MD5 给你一个字节[],SessionID 好像是一个字符串。您使用十六进制将 byte[] 转换为字符串。但谁这么说的?为什么不转换为base64?为什么不将字符串转换为 byte[] 呢?规范不完整。
  • @jps 对于不完整的示例感到抱歉。 SecureStringHelper 只是将 SecureString 转换回字符串。所以基本上,你也可以直接为 Password 参数传递一个“字符串”来测试它。
  • @ThomasWeller 好吧,我拥有的唯一信息是哈希需要看起来像MD5(session + MD5(username+ password))。所有三个参数都是字符串,我使用了我在 google 中找到的示例(方法中的链接)。所以我不知道到底什么是正确的方法。

标签: c# encryption md5


【解决方案1】:

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

如果你替换:

inputBuffer.AddRange(md5.Hash);

与:

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

Try it online

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

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

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

【讨论】:

  • 感谢您的回答。我会试试这个。我正在为该项目使用 NetStandard2.1。感谢您让我知道SecureString。不,我只是创建了一个应用程序,用于通过 Rest-API 与该服务器进行交互。它自己的服务器不是我制作的,我无权访问源代码。谢谢!
  • 你的例子奏效了。非常感谢您的快速帮助!
猜你喜欢
  • 2012-04-14
  • 1970-01-01
  • 2011-12-08
  • 2020-09-24
  • 2012-10-26
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
相关资源
最近更新 更多