如何匹配以字节c#保存的数据库中保存的所有指纹

时间:2018-02-11 03:06:32

标签: c# mysql fingerprint

我可以使用sql查询匹配指纹"其中id"。但我想要的是识别数据库上的所有指纹。

我使用zk4500指纹扫描仪。 Mysql c#。对不起我的英语和解释我只是一个新手..

if (bIdentify)
{

    if (userid.Text == string.Empty)
    {
        return;
    }
    // int ret = zkfp.ZKFP_ERR_OK;

    int fid = 0, score = 0;
    mysqlConn.Open();
    MySqlCommand cmd1 = mysqlConn.CreateCommand();
    cmd1.CommandText = (@"select * from emp_fingerprint where emp_id=?emp_id");
    //cmd1.Parameters.AddWithValue("?fingerprint_1", dbfp);
    cmd1.Parameters.AddWithValue("?emp_id", userid.Text);
    MySqlDataAdapter da = new MySqlDataAdapter(cmd1);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dr = cmd1.ExecuteReader();
    while (dr.Read())
    {

        byte[] dbfp = new byte[2048];

        dbfp = (byte[])(dr["fingerprint_1"]);
        string a = dr["emp_id"].ToString();
        dr.Close();
        mysqlConn.Close();

        int match = zkfp2.DBMatch(mDBHandle, CapTmp, dbfp);

        if (match > 0)
        {

            textBox1.Text = "Identify success, percent= " + match + "%";

            break;
        }
        else
        {
            textBox1.Text = "Identify fail, percent= " + match + "%";
            return;
        }
    }
}

我的主要问题是我不知道如何将指纹扫描仪返回的字节存储在数据库中,然后查询这些字节以获得他们所属的用户

1 个答案:

答案 0 :(得分:1)

<强>首先

我认为您的数据库结构应该包含一个FingerPrint表,其中包含用户表的外键。这将允许您为一个用户存储多个指纹和对齐。

<强>其次

我不认为你可以通过二进制数据查询表,除非它存储为字符串。

所以(而且我不确定这是多么安全),您可能会使用指纹表中的指纹字节以及用户主键

来散列您的指纹并将数据存储在数据库中
using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
    hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}

当您想要查找手指打印时,您可以轻松地对指纹打印数据进行散列,查询指纹表以获取散列并返回结果。你也可以仔细检查你的指纹字节与返回的结果(在内存中),以确保。

所有这些的结果将为您提供User表的主键。

获得用户主键后,您可以向用户查询UserId(主键)

<强>更新

假设你有一个FingerPrint表

Id     // Primary Key
UserId // Foreign key
Hash
FingerPrintData

方法获取哈希

public string GetHashFromFingerPrintData(byte[] fingerPrintData)
{
    using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
    {
        return Convert.ToBase64String(sha1.ComputeHash(fingerPrintData));
    }
}

比较指纹字节的方法

public bool DoFingerPrintsMatch(byte[] a1, byte[] b1)
{
    var i = 0;
    if (a1.Length != b1.Length)
    {
        return i == a1.Length;
    }

    while ((i < a1.Length) && (a1[i] == b1[i]))
    {
        i++;
    }

    return i == a1.Length;
}

获取用户ID的方法

public int GetUserId(byte[] fingerPrintData)
{
    var connStr = "...";
    var conn = new MySqlConnection(connStr);
    var userId = -1;
    try
    {
        conn.Open();

        var sql = "SELECT UserId, FingerPrintData FROM FingerPrint WHERE Continent = @FingerPrintHash";
        var command = new MySqlCommand(sql, conn);
        command.Parameters.AddWithValue("@FingerPrintHash", fingerPrintData);
        var reader = command.ExecuteReader();

        while (reader.Read())
        {
            byte[] data = reader["FingerPrintData"];
            userId  = reader["UserId"];

            if (DoFingerPrintsMatch(fingerPrintData, data))
            {
                break;
            }

        }

        reader.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
    finally
    {
        conn.Close();
    }


    return userId;
}

免责声明 :这是完全未经测试的,但当然这应该能指出正确的方向,而无需为您编写程序