Ошибка неверной солевой версии в библиотеке BCrypt.Net - приложение WinForms / C # с БД MySQL - PullRequest
0 голосов
/ 11 сентября 2018

В настоящее время я делаю менеджер паролей, поэтому я делаю форму входа в систему с полями имени пользователя и пароля. Я хочу bcrypt пароль. Я храню соль и хешированный пароль в базе данных ( снимок экрана 1 ). Когда пользователь вводит свое имя пользователя и пароль, я делаю следующее:

1. Извлеките соль из БД и используйте метод BCrypt.Net.BCrypt.HashPassword(password.Text, sal), чтобы хэшировать представленный пароль с солью из базы данных

2. Извлеките исходный хэшированный пароль из таблицы БД, а затем используйте метод BCrypt.Net.BCrypt.Verify(submhash, passdb), чтобы проверить, совпадают ли 2 хэша паролей.

3. Если они совпадают, я открываю основную форму программы.

Однако VS Studio выдает исключение: Недопустимая соленая версия ( снимок экрана 2 )

Я хотел бы спросить, в чем проблема и как ее исправить?

            conn.Open();
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = conn;
            cmd.Parameters.AddWithValue("@usr", username.Text);
           // cmd.Parameters.AddWithValue("@pas", password.Text);
            cmd.CommandText = "select password from users where username = @usr";
            passdb = (string)cmd.ExecuteScalar();
            MySqlCommand ss = new MySqlCommand();
            ss.Connection = conn;
            ss.Parameters.AddWithValue("@uun", username.Text);
            ss.CommandText = "select salt from users where username  = @uun";
            sal= (string)ss.ExecuteScalar();
            submhash = BCrypt.Net.BCrypt.HashPassword(password.Text, sal);
            MySqlCommand com = new MySqlCommand();
            com.Connection = conn;
            com.Parameters.AddWithValue("@unm", username.Text);
            if (BCrypt.Net.BCrypt.Verify(submhash, passdb))
            {
                frmMain fm = new frmMain();
                SesUser.username = username.Text;
                SesUser.password = password.Text;
                this.Hide();
                fm.Show();


            }
            else
            {
                MessageBox.Show("Username or password is incorrect!","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
                i++;

            }

        }

Ответы [ 2 ]

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

Я столкнулся с этой ошибкой, когда в префиксе зашифрованной строки присутствовал недопустимый символ, который bcrypt должен был хэшировать / проверить. Убедитесь, что входная строка функции bcrypt начинается с правильной версии bcrypt и длины соли (например, $ 2b $ 10), как показано в этой статье википедии .

Я бы проверил строку 'sal' в вашем коде, чтобы убедиться, что она содержит правильную версию хеширования (начинается с этой последовательности $ 2b $ xyz)

0 голосов
/ 11 сентября 2018

Сначала вы должны обернуть MySqlCommand внутри оператора using, потому что DbCommand реализует IDisposable.

Относительно вашей проблемы с BCrypt.

Вам не нужно создавать новый хеш и сравнивать его с сохраненным хеш-значением. Потому что каждый раз, когда вы делаете это, вы получаете новый хэш. Вам просто нужно проверить пароль по сохраненному хешу с BCrypt.Net.

Так должно работать следующее

if (BCrypt.Net.BCrypt.Verify(password.Text, passdb))
{
  // logged in
}
// not logged in

Я ожидаю, что passdb содержит хеш bcrypt, как следующие:

$2a$12$VvDRKYKGt4Zd2Ux35LeG2OI.Vr5f.UuY2q7MrnHlJj4K5diifQV3e
...