Как правильно хешировать пароль - PullRequest
0 голосов
/ 16 апреля 2019

Я хочу заново создать процесс хеширования 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 ??»в то время как фактический результат должен выглядеть примерно так:

1 Ответ

0 голосов
/ 16 апреля 2019

Здесь есть неизвестные.Какую кодировку использует 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...