我想重新创建MyBB哈希过程,以便可以使用其数据库来验证第三方应用程序(使用C#编写)上的用户。
MyBB使用:
md5(md5($salt).password)
我的问题是我在C#上获得的结果与MyBB所获得的结果相去甚远。
我在C#上所做的事情:
public string HashPass(string password, string salt)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] saltHash =md5.ComputeHash(System.Text.Encoding.ASCII.GetBytes(salt));
string passwordAndSalt = password + System.Text.Encoding.ASCII.GetString(saltHash);
byte[] finalHash = md5.ComputeHash(System.Text.Encoding.ASCII.GetBytes(passwordAndSalt));
string final = System.Text.Encoding.ASCII.GetString(finalHash);
return final;
}
使用该函数输入密码“ Test123”和盐“ 0fYR6mEE”(从MyBB db收集)得到的结果是:“ ?? R ????? s ??”而实际结果应类似于“ VaHffsyzJeEa4dB3bbMWeUlJObAfN5I9rf1CuNRXCa6xPJTzXL”。
很可能我缺少明显的东西,对此感到抱歉。
答案 0 :(得分:0)
这里有未知数。 MyBB对密码字节使用哪种编码?它可以是ASCII,ANSI或UTF8,也可以直接获取字符串字节,即不进行编码。所以我会部分将其编写为伪代码
byte[] passwordBytes = GetBytes(password); // Where you have to define GetBytes
byte[] saltBytes = System.Convert.FromBase64String(salt); // Assuming it is given as base64
// Merge the password bytes and the salt bytes
var mergedBytes = new byte[passwordBytes.Length + saltBytes.Length];
Array.Copy(passwordBytes, mergedBytes, passwordBytes.Length);
Array.Copy(saltBytes, 0, mergedBytes, passwordBytes.Length, saltBytes.Length);
var md5 = new MD5CryptoServiceProvider();
byte[] finalHash = md5.ComputeHash(mergedBytes);
string final = System.Convert.ToBase64String(finalHash);
请注意,我要合并密码字节和盐字节,而不是密码字符串和盐字符串。然后,MD5只从这些合并的字节中提取了一次。
但是我不确定md5(md5($salt).password)
会做什么。 md5()
是否已经将哈希返回为base64字符串?也许您必须将盐从base64转换为bytes[]
,然后获取MD%哈希,将其转换为base64字符串,然后将其与密码字符串连接。然后从该组合字符串中获取字节,再次进行哈希处理,然后再次将结果转换为base64字符串。
您必须进一步深入了解MyBB的源代码。