我正在尝试使用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);
}
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从您提供的代码片段来看,问题可能出在几个环节:
模板比较逻辑错误:在您的验证逻辑中,您将提取的特征与一个预设的模板进行比较,然后根据这个比较结果去数据库查询是否有匹配的指纹。但是,您的数据库查询逻辑似乎有误。无论指纹是否验证成功(result.isVerified()
的结果),您都显示“Fingerprint doesn't match the User ID”,并且执行了相同的错误提示代码块。这表明即使验证通过,也会因为错误的分支处理而告知用户失败。
数据库查询目的不明确:通常,在验证指纹时,您应该已经有一个与特定用户ID关联的指纹模板存储在数据库中。验证过程应该是先根据用户ID从数据库获取模板,然后用当前采集的指纹特征与之比较,而不是直接拿新特征去数据库查找是否有匹配项。您的代码逻辑似乎是反过来的,尝试用新特征去数据库找匹配,这并不符合常规的认证流程。
未正确使用数据库数据:即使逻辑上调整为正确的验证流程,您也需要确保从数据库取出的模板数据正确地反序列化并用于验证。目前代码中没有展示如何处理从数据库取出的数据来参与验证过程。
修正验证逻辑顺序:
修改数据库查询部分:
// 假设已根据用户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执行的异常捕获和处理,以及资源的关闭等。此外,考虑到安全性,处理生物识别数据时应遵循相关的隐私保护法规和最佳实践。