开发者社区 问答 正文

在Java中使用U验证指纹是数字角色

我正在尝试使用Digital Persona SDK验证指纹。我可以使用以下代码捕获并将模板保存到MySQL数据库,但是问题出在验证期间。当我尝试验证指纹时,总是显示失败。这是注册和验证代码。我会发布注册代码,但是由于冗长的代码,stackoverflow无法让我

protected void process(DPFPSample sample) {
       super.process(sample);

       // Process the sample and create a feature set for the enrollment purpose.
       features = extractFeatures(sample, DPFPDataPurpose.DATA_PURPOSE_VERIFICATION);

       // Check quality of the sample and start verification if it's good
       if (features != null) {
           // Compare the feature set with our template
           DPFPVerificationResult result = verificator.verify(features, ((MainForm) getOwner()).getTemplate());
           // updateStatus(result.getFalseAcceptRate());
           if (result.isVerified()) {
               try {
                   DPFPTemplate templat = ((MainForm) getOwner()).getTemplate();
                   byte[] vrr = templat.serialize();

                   pst = con.prepareStatement("select fingerprint from accounts where fingerprint=?");
                   pst.setBytes(1, vrr);
                   rs = pst.executeQuery();
                   if (rs.next()) {
                       JOptionPane.showMessageDialog(this, "Fingerprint doesn't match the User ID", "Unable to Login", JOptionPane.ERROR_MESSAGE);

                   } else {
                       JOptionPane.showMessageDialog(this, "Fingerprint doesn't match the User ID", "Unable to Login", JOptionPane.ERROR_MESSAGE);

                   }

               } catch (SQLException e) {
               }
           } else {
               makeReport("The fingerprint was NOT VERIFIED.");
               JOptionPane.showMessageDialog(this, "The fingerprint was NOT VERIFIED.", "Verification Failed", JOptionPane.ERROR_MESSAGE);
           }
       }
   }

展开
收起
垚tutu 2019-12-04 17:16:45 558 分享 版权
阿里云 AI 助理回答

从您提供的代码片段来看,问题可能出在几个环节:

  1. 模板比较逻辑错误:在您的验证逻辑中,您将提取的特征与一个预设的模板进行比较,然后根据这个比较结果去数据库查询是否有匹配的指纹。但是,您的数据库查询逻辑似乎有误。无论指纹是否验证成功(result.isVerified()的结果),您都显示“Fingerprint doesn't match the User ID”,并且执行了相同的错误提示代码块。这表明即使验证通过,也会因为错误的分支处理而告知用户失败。

  2. 数据库查询目的不明确:通常,在验证指纹时,您应该已经有一个与特定用户ID关联的指纹模板存储在数据库中。验证过程应该是先根据用户ID从数据库获取模板,然后用当前采集的指纹特征与之比较,而不是直接拿新特征去数据库查找是否有匹配项。您的代码逻辑似乎是反过来的,尝试用新特征去数据库找匹配,这并不符合常规的认证流程。

  3. 未正确使用数据库数据:即使逻辑上调整为正确的验证流程,您也需要确保从数据库取出的模板数据正确地反序列化并用于验证。目前代码中没有展示如何处理从数据库取出的数据来参与验证过程。

建议改进方案:

  • 修正验证逻辑顺序

    1. 用户输入或选择其用户ID。
    2. 根据用户ID从数据库检索对应的指纹模板。
    3. 当用户扫描指纹时,提取特征并与从数据库获取的模板进行比对。
    4. 根据验证结果给出正确反馈。
  • 修改数据库查询部分

    // 假设已根据用户ID获取到templateId,并以此查询数据库
    long templateId = /* 获取对应用户的模板ID */;
    PreparedStatement pst = con.prepareStatement("SELECT fingerprint FROM accounts WHERE id = ?");
    pst.setLong(1, templateId);
    ResultSet rs = pst.executeQuery();
    
    if (rs.next()) {
       byte[] dbTemplateBytes = rs.getBytes("fingerprint");
       DPFPTemplate templateFromDB = DPFPTemplate.deserialize(dbTemplateBytes);
    
       // 使用从数据库获取的模板进行验证
       DPFPVerificationResult result = verificator.verify(features, templateFromDB);
       if (result.isVerified()) {
           JOptionPane.showMessageDialog(this, "Fingerprint verified successfully.", "Login Successful", JOptionPane.INFORMATION_MESSAGE);
       } else {
           JOptionPane.showMessageDialog(this, "The fingerprint was NOT VERIFIED.", "Verification Failed", JOptionPane.ERROR_MESSAGE);
       }
    } else {
       JOptionPane.showMessageDialog(this, "No fingerprint template found for the user.", "User Not Found", JOptionPane.ERROR_MESSAGE);
    }
    

请确保在实际应用中处理好异常情况,比如数据库连接、SQL执行的异常捕获和处理,以及资源的关闭等。此外,考虑到安全性,处理生物识别数据时应遵循相关的隐私保护法规和最佳实践。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答