【发布时间】: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