Nganku Junior Ответов: 1

Как войти в систему с изображением в качестве пароля


Hi, I'm trying to setup a Login with fingerPrints. The idea is to select username from a combobox and provide fingerprint.  The pair is then compared against database stored values and if a match is hit Access is granted.

The datatype of the print is 'image' in the database however to store it i have to convert it to an array of type byte.
ComboBox1 DropDownStyle is DropDownList

My idea is to convert whatever is in the picture box to the same datatype and then compare.
 I have not been successful. I keep receiving the message ;
{"The data types image and varbinary(max) are incompatible in the equal to operator."}
raised at >> dr = clgq.ExecuteReader(); <<

what do i need to to get this right. I already included the System.Drawing.Imaging, System.IO, Libraries.Help Please


Что я уже пробовал:

private void button2_Click(object sender, EventArgs e)
            {
            string lgq = "select name, picture from photo where name= '" + comboBox1.Text + "' and picture= @pc";
            

            MemoryStream ms = new MemoryStream();//Declare a memory stream
            pictureBox1.Image.Save(ms, ImageFormat.Jpeg);//Create a value of PictureBox1 as a memory stream with jpg encoding
            byte[] pic = ms.ToArray(); //convert this memory stream to an array of bytes

            SqlCommand clgq = new SqlCommand(lgq, con);
            clgq.Parameters.AddWithValue("@pc", pic);

            SqlDataReader dr;
            dr = clgq.ExecuteReader();
            int T = 0;
            while(dr.Read())
                {
                T++;
                }
            if (T == 1)
                MessageBox.Show("Login Successful", " ", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                MessageBox.Show("Login Not Successful", " ", MessageBoxButtons.OK, MessageBoxIcon.Stop);

            }

1 Ответов

Рейтинг:
9

OriginalGriff

ОК...преобразование изображения в байты (чтобы вы могли их хранить) и обратно в изображение (когда вы их извлекаете) довольно просто - вы сделали одну сторону. Преобразование из байтов в изображение вам делать не нужно - SQL SELECT вернет массив байтов,который вы CNA просто приведете.
Но ... такой подход не сработает.
Во-первых, то, что вы делаете, опасно: никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Во - вторых, вы не можете попросить SQL сравнить два байтовых массива-он этого не делает, поэтому вам нужно получить байтовые данные из SQL и сравнить их самостоятельно, а не ожидать, что SQL сделает это за вас.

В-третьих - и это главное-он почти наверняка никогда не будет соответствовать. Подумайте о разрешении того, чем вы сканируете отпечаток пальца, а теперь подумайте вот о чем:есть ли на линзе хоть одна пылинка? Если есть, то эти два образа не будут одинаковыми. Вращается ли палец даже бесконечно по сравнению с тем, когда он был первоначально отсканирован? Если так... Перемещается ли палец хотя бы на крошечную долю миллиметра вертикально или горизонтально по сравнению с оригиналом? Если так...
Он всегда будет другим. Чтобы сравнить отпечатки пальцев, вы не сравниваете изображения, вам нужно искать значимые формы, складки, завитки, разрывы и тому подобное, что делает их уникальными. Это не так тривиально, как "эта картина идентична той?"