Как войти в myBB в C#. (Хеширование не работает правильно) - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь войти в учетную запись mybb на моем форуме. Мне нужно использовать базу данных SQL для входа в систему, но пароли хешируются. Я пробовал почти все, включая хеширование пароля для входа в систему, но он просто не работает.

Он работает с обычным нехешированным паролем, но не с хешированным.

string salt = Global.salt; // get salt from db
string password = textBox2.Text;// get password from user
MD5 md5 = new MD5CryptoServiceProvider();

// Create md5 hash of salt
byte[] saltBytes = Encoding.Default.GetBytes(salt);
byte[] saltHashBytes;
using (Stream saltStream = GenerateStreamFromString(salt))
{
    saltHashBytes = md5.ComputeHash(saltStream);
}
string saltHash = System.BitConverter.ToString(saltHashBytes);

// Create your md5(password + md5(salt)) hash
byte[] passwordBytes = Encoding.Default.GetBytes(password + saltHash);
byte[] passwordHashBytes;
using (Stream saltStream = GenerateStreamFromString(salt))
{
    passwordHashBytes = md5.ComputeHash(saltStream);
}
string passwordHash = BitConverter.ToString(passwordHashBytes);

MessageBox.Show(passwordHash);

cmd = new MySqlCommand();
con.Open();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM testfdata_users where username='" + textBox1.Text + "' AND password='" + passwordHash + "'";
dr = cmd.ExecuteReader();
if (dr.Read())
{
    MessageBox.Show("Login success ");
}
else
{
    MessageBox.Show("Invalid Login please check username and password");
}
con.Close();

Вот как я собираю соль из базы данных.

MySqlConnection con2 = new MySqlConnection("Server=host.com;Database=baseName;user=username;Pwd=pass;SslMode=none");
MySqlCommand cmd = new MySqlCommand("SELECT * FROM testfdata_users", con2);

con2.Open();

MySqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())
{
    Global.salt = reader.GetString("salt");
}

1 Ответ

0 голосов
/ 20 января 2020

Я понял, в чем проблема. Я поделюсь с вами тем, что любой, у кого есть такая же проблема, может найти ее здесь.

Сначала вам нужно создать этот метод.

public string CalculateMD5Hash(string input)
{
     MD5 md5 = System.Security.Cryptography.MD5.Create();
     byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
     byte[] hash = md5.ComputeHash(inputBytes);

     StringBuilder sb = new StringBuilder();
     for (int i = 0; i < hash.Length; i++)
     {
          sb.Append(hash[i].ToString("x2"));
     }
     return sb.ToString();
}

Далее вам нужно взять соль из вашей SQL базы данных

string salt;

MySqlConnection con2 = new MySqlConnection("Server=hostname;Database=databasename;user=username;Pwd=password;SslMode=none");

MySqlCommand cmd = new MySqlCommand("SELECT * FROM mybb_users", con2);

con2.Open();

MySqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())
{
     if (reader.GetString("username") == user) // You can get 'user' from a textbox
          salt = reader.GetString("salt");
}

Затем вам нужно иметь sh пароль, введенный пользователем

string passwordHash = CalculateMD5Hash(CalculateMD5Hash(salt) + CalculateMD5Hash(password));

Наконец, вы можете войти

MySqlConnection con = new MySqlConnection("Server=remotemysql.com;Database=fofBv30s0W;user=fofBv30s0W;Pwd=sUFDdE8Tun;SslMode=none");

cmd = new MySqlCommand();
con.Open();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM mybb_users where username='" + username + "' AND password='" + passwordHash + "'";
dr = cmd.ExecuteReader();
if (dr.Read())
{
     // Do what you want after login
}
else
{
     MessageBox.Show("Invalid Login please check username and password");
}
con.Close();

Вместе код должен выглядеть примерно так:

public string CalculateMD5Hash(string input)
{
     MD5 md5 = System.Security.Cryptography.MD5.Create();
     byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
     byte[] hash = md5.ComputeHash(inputBytes);

     StringBuilder sb = new StringBuilder();
     for (int i = 0; i < hash.Length; i++)
     {
          sb.Append(hash[i].ToString("x2"));
     }
     return sb.ToString();
}

private void button_Click(object sender, EventArgs e)
{
     string salt;
     string user = txtBx_User.Text;
     string password = txtBx_Pass.Text;

     MySqlConnection con2 = new MySqlConnection("Server=hostname;Database=databasename;user=username;Pwd=password;SslMode=none");

     MySqlCommand cmd = new MySqlCommand("SELECT * FROM mybb_users", con2);

     con2.Open();

     MySqlDataReader reader = cmd.ExecuteReader();

     while (reader.Read())
     {
          if (reader.GetString("username") == user)
               salt = reader.GetString("salt");
     }

     string passwordHash = CalculateMD5Hash(CalculateMD5Hash(salt) + CalculateMD5Hash(password));

     MySqlConnection con = new MySqlConnection("Server=remotemysql.com;Database=fofBv30s0W;user=fofBv30s0W;Pwd=sUFDdE8Tun;SslMode=none");

     cmd = new MySqlCommand();
     con.Open();
     cmd.Connection = con;
     cmd.CommandText = "SELECT * FROM mybb_users where username='" + username + "' AND password='" + passwordHash + "'";
     dr = cmd.ExecuteReader();
     if (dr.Read())
     {
          // Do what you want after login
     }
     else
     {
          MessageBox.Show("Invalid Login please check username and password");
     }
     con.Close();
}
...