Для начала я предположил, что с этого момента и из нескольких предыдущих вопросов я заметил, что самый простой способ фактически "сравнить значения хеш-функции" с данными, переданными через базу данных, состоит в том, чтобы просто посмотреть, является ли запрос, оператор "SELECT", "WHERE", "FROM" (x = x2) "фактически был успешно выполнен (возвращая значение, большее нуля).
private void button1_Click(object sender, EventArgs e)
{
string AppUsername = textBox2.Text.ToString();
string AppPassword = textBox1.Text.ToString();
byte[] salt;
new RNGCryptoServiceProvider().GetBytes(salt = new byte[16]);
var pbkdf2 = new Rfc2898DeriveBytes(AppPassword, salt, 10000);
byte[] hash = pbkdf2.GetBytes(20);
byte[] hashBytes = new byte[36];
Array.Copy(salt, 0, hashBytes, 0, 16);
Array.Copy(hash, 0, hashBytes, 16, 20);
string savedPasswordHash = Convert.ToBase64String(hashBytes); // <-- see ' /3751242/kak-heshirovat-parol ' for the part on comparing the recalculated
SqlConnection con = new SqlConnection();
con.ConnectionString = ("Data Source=DESKTOP-PGHMM6M;Initial Catalog=LocalUsers;Integrated Security=True");
con.Open(); //dbo.data?
var cmd = new SqlCommand(@"SELECT Username, Hash FROM data WHERE (Hash = @savedPasswordHash");
cmd.Parameters.AddWithValue("@savedPasswordHash", savedPasswordHash);//^ this should work right?
if (cmd.ExecuteNonQuery() > 0) {
MessageBox.Show(" Query successful..something matched.. ");
}
}
Я подтвердил, что локальная база данныхзаполняется хеш-значением, которое должно соответствовать тому, которое сравнивается.
Но я полагаю, что со вторым фрагментом кода что-то не так:
SqlConnection con = new SqlConnection();
con.ConnectionString = ("Data Source=DESKTOP-PGHMM6M;Initial Catalog=LocalUsers;Integrated Security=True");
con.Open(); //dbo.data?
var cmd = new SqlCommand(@"SELECT Username, Hash FROM data WHERE (Hash = @savedPasswordHash");
cmd.Parameters.AddWithValue("@savedPasswordHash", savedPasswordHash);//^ this should work right?
if (cmd.ExecuteNonQuery() > 0) {
MessageBox.Show(" Query successful..something matched.. ");
Я бы не стал спорить с избирателями, если бы этот вопрос был отнесен к числу дублирующих вопросов;но, как я выяснил из предыдущих вопросов, ни один из них не помог мне решить мою проблему.
Обновление
Я только что понял, что полученная ошибка относится к фактическому соединению:
ExecuteNonQuery: свойство подключения не было инициализировано.
Я использую тот же код, что и для ввода значений.
SqlConnection con = new SqlConnection();
con.ConnectionString = ("Data Source=DESKTOP-PGHMM6M;Initial Catalog=LocalUsers;Integrated Security=True");
con.Open();
Я все еще предполагаю, что проблема должна быть где-то с фактической настройкой запроса или параметрами, но я не уверен: /
Обновление 2
Iразобрался что не так с ошибкой инициализации.Как было сказано, я никогда не инициализировал соединение ..
Добавление следующего кода:
cmd.Connection = con;
исправило это.
Код теперь выглядит следующим образом:
SqlConnection con = new SqlConnection();
con.ConnectionString = ("Data Source=DESKTOP-PGHMM6M;Initial Catalog=LocalUsers;Integrated Security=True");
con.Open(); //dbo.data?
var cmd = new SqlCommand(@"SELECT Username, Hash FROM data WHERE (Hash = @savedPasswordHash");
cmd.Connection = con;
cmd.Parameters.AddWithValue("@savedPasswordHash", savedPasswordHash);//^ this should work right?
if (cmd.ExecuteNonQuery() > 0) {
MessageBox.Show(" Query successful..something matched.. ");
//change page.. load a profile?
}
Но возвращает другую ошибку, связанную с фактическим синтаксисом моего запроса, с которым я изначально думал, что ошибка связана с этим.
В нем говорится, что неправильный синтаксис находится рядом с @savedPasswordHash.
Любой совет по синтаксису SQL приветствуется.