如何计算像 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));
P.S。如果您使用的是 .NET Core 或 .NET 5,Microsoft 建议不要使用 SecureString
进行新开发。 Source
P.P.S。如果您控制此交易的两端(创建和验证哈希),我建议更改您处理用户名和密码部分的方式,因为以下将在第一步中产生相同的哈希:
Username: bob Password: bythechickenshed
Username: bobby Password: thechickenshed
我需要加密凭据才能连接到远程服务器。 从我找到的文档中,密码需要像下面显示的那样被散列。
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));
P.S。如果您使用的是 .NET Core 或 .NET 5,Microsoft 建议不要使用 SecureString
进行新开发。 Source
P.P.S。如果您控制此交易的两端(创建和验证哈希),我建议更改您处理用户名和密码部分的方式,因为以下将在第一步中产生相同的哈希:
Username: bob Password: bythechickenshed
Username: bobby Password: thechickenshed