如何正确地对密码进行哈希处理

时间:2019-04-16 18:04:39

标签: c# md5

我想重新创建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”。

很可能我缺少明显的东西,对此感到抱歉。

1 个答案:

答案 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的源代码。