如何正确哈希密码

问题描述 投票:-3回答:1

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

很可能我错过了一些明显的东西,抱歉。

c# md5
1个回答
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);        

请注意,我正在合并密码字节和salt字节,而不是密码字符串和salt字符串。然后MD5只从这些合并的字节中取出一次。

但我不确定md5(md5($salt).password)会做什么。 md5()已经将哈希作为base64字符串返回吗?也许您必须将salt从base64转换为bytes[],然后获取MD%哈希,将其转换为base64字符串,然后将其与密码字符串连接。然后从这个组合字符串中获取字节,再次执行哈希并再次将结果转换为base64字符串。

你必须深入研究MyBB的源代码才能确定。

© www.soinside.com 2019 - 2024. All rights reserved.