Está en la página 1de 18

Desarrollo de un sistema de Huella Digital con Java

y mySQL
Publicado por napster2011 el 29 de marzo de 2012
Publicado en: Base de Datos, Linux, Programacion, Tecnología, Windows. 34
comentarios

Hola amigos, hace aproximadamente un mes publique un articulo, donde les enseñaba a
desarrollar un sistema de autenticacion por huella digital utilizando como lenguaje de
programación JAVA y como motor de bases de datos mySQL Server 5.1.

El día de hoy traigo el sistema completamente actualizado y modificado, de tal forma


que les sirva a todos este pequeño tutorial, y lo puedan implementar en su lugar de
trabajo.

El primero artículo fue publicado exactamente el 20 de Febrero de 2012, en este mismo


blog y su URL es la siguiente: http://napster2011.wordpress.com/2012/02/20/lector-de-
huella-digital-en-java/

Después de publicar esta nueva entrega de la programación de un lector de huella digital


con JAV y mySQL, haré una tercera entrega donde presentare el mismo sistema pero
utilizando como motor de bases de datos, Oracle 11g.

Sin más preámbulos, procedo a explicar el proceso:

Para el desarrollo del proyecto, utilicé el IDE para programar en Java de Oracle,
llamado NetBeans 7.1
Como pueden observar, nuestro proyecto se llama LectorHuellas y consta de tres
clases, y cada una de éstas (las clases) tiene su respectiva función dentro del proyecto:

Clase Interfaz

Esta clase contiene el archivo PantallaPrincipal.java y es quien se encarga de diseñar la


interfaz principal de nuestro sistema de autenticación por huella digital.

Diseño de la pantalla principal de nuestro sistema

El contenido del archivo PantallaPrincipal.java es el siguiente:

/**
* @package: interfaz
* @class: PantallaPrincipal
* @author: Ricardo Rosero
* @version: 1.0
*/
package interfaz;

/**
* @librerias importadas
* @author: Ricardo Rosero
*/
import com.griaule.grfingerjava.GrFingerJavaException;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.BevelBorder;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import procedimientos.Util;

public class PantallaPrincipal extends javax.swing.JFrame {


/**
* @atributos
* @author: Ricardo Rosero
* @access: private
*/
//objecto usado para realizar todas las operaciones relacionadas al Fingerprint-SDK
private Util procedimientosSDK;
//Panel para mostrar la huella digital
private JPanel fingerprintViewPanel = null;
//Imagen de la huella actual
private BufferedImage fingerprintImage = null;

/**
* @function: PantallaPrincipal
* @author: Ricardo Rosero
* @access: public
* @return
*/
public PantallaPrincipal() {
inicializar();
initComponents();
procedimientosSDK.inicializarCaptura();
setLocationRelativeTo(null);
setVisible(true);
}

/**
* @function: inicializar
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void inicializar() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e) {
System.err.println(“No se pudo aplicar el estilo visual”);
}
//Crea una instancia de Util
this.procedimientosSDK = new Util(this);
}

/**
* @function: crearPanelHuella
* @author: Ricardo Rosero
* @access: private
* @return
*/
private JComponent crearPanelHuella() {
//Crea un panel nuevo para mostrar la huella
fingerprintViewPanel = new JPanel(){
//Se sobreescribe el método paintComponent para habilitar la muestra de la imagen de
la huella
public void paintComponent(Graphics g) {
super.paintComponent(g);
//Si hay una imagen para ser mostrada
if (fingerprintImage!=null) {
//Calcula el tamaño y posición de la imagen para ser pintada el tamaño es ajustado
para que ocupe todo el tamaño del panel
Insets insets = getInsets();
int transX = insets.left;
int transY = insets.top;
int width = getWidth() – getInsets().right – getInsets().left;
int height = getHeight() – getInsets().bottom – getInsets().top;
//Se dibuja la imagen
g.drawImage(fingerprintImage, transX, transY, width, height, null);
}
}
};
//Se agrega un border alrededor del panel
fingerprintViewPanel.setBorder(new CompoundBorder (
new EmptyBorder (2,2,2,2),
new BevelBorder(BevelBorder.LOWERED)));
fingerprintViewPanel.setToolTipText(“Imagen de la última huella capturada.”);
if(fingerprintViewPanel==null){
System.exit(1);
return null;
}
else{
return fingerprintViewPanel;
}
}

/**
* @function: showImage
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void showImage(BufferedImage image) {
//Utiliza el imageProducer para crear una imagen de la huella digital
fingerprintImage = image;
//Se dibuja la nueva imagen
repaint();
}

/**
* @function: initComponents
* @author: Ricardo Rosero
* @access: private
* @return
*/
@SuppressWarnings(“unchecked”)
// <editor-fold defaultstate=”collapsed” desc=”Generated Code”>
private void initComponents() {

jPanel2 = new javax.swing.JPanel();


btnIdentificar = new javax.swing.JButton();
btnGuardar = new javax.swing.JButton();
btnSalir = new javax.swing.JButton();
PanelContenedor = new javax.swing.JPanel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowActivated(java.awt.event.WindowEvent evt) {
formWindowActivated(evt);
}
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});

jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(new
javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED),
“Acciones”, javax.swing.border.TitledBorder.CENTER,
javax.swing.border.TitledBorder.DEFAULT_POSITION));

btnIdentificar.setText(“Identificar”);
btnIdentificar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnIdentificarActionPerformed(evt);
}
});

btnGuardar.setText(“Guardar”);
btnGuardar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnGuardarActionPerformed(evt);
}
});

btnSalir.setText(“Salir”);
btnSalir.setAlignmentY(0.0F);
btnSalir.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnSalirActionPerformed(evt);
}
});

javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);


jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.L
EADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(btnIdentificar, javax.swing.GroupLayout.PREFERRED_SIZE, 124,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnGuardar, javax.swing.GroupLayout.PREFERRED_SIZE, 124,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
jPanel2Layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(btnSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 124,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(100, 100, 100))))
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.B
ASELINE)
.addComponent(btnGuardar, javax.swing.GroupLayout.PREFERRED_SIZE, 35,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnIdentificar, javax.swing.GroupLayout.PREFERRED_SIZE, 35,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(btnSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 35,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);

PanelContenedor.setBorder(javax.swing.BorderFactory.createTitledBorder(null,
“Huella Digital”, javax.swing.border.TitledBorder.CENTER,
javax.swing.border.TitledBorder.DEFAULT_POSITION));
PanelContenedor.setLayout(new java.awt.BorderLayout());

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());


getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(PanelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, 364,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addComponent(PanelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, 353,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);

PanelContenedor.getAccessibleContext().setAccessibleParent(jPanel2);

pack();
}// </editor-fold>

/**
* @function: btnGuardarActionPerformed
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {
try {
//procedimientosSDK.guardarHuella();
//procedimientosSDK.guardarHuellaBackup();
procedimientosSDK.guardar();
} catch (GrFingerJavaException ex) {
Logger.getLogger(PantallaPrincipal.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* @function: btnSalirActionPerformed
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) {

dispose();
}
/**
* @function: formWindowActivated
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void formWindowActivated(java.awt.event.WindowEvent evt) {
this.PanelContenedor.add(this.crearPanelHuella());
}
/**
* @function: formWindowClosing
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void formWindowClosing(java.awt.event.WindowEvent evt) {

}
/**
* @function: btnIdentificarActionPerformed
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void btnIdentificarActionPerformed(java.awt.event.ActionEvent evt) {
try {
procedimientosSDK.identificarPersona();
} catch (GrFingerJavaException ex) {
Logger.getLogger(PantallaPrincipal.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* @atributos
* @author: Ricardo Rosero
* @access: private
*/
// Variables declaration – do not modify
private javax.swing.JPanel PanelContenedor;
private javax.swing.JButton btnGuardar;
private javax.swing.JButton btnIdentificar;
private javax.swing.JButton btnSalir;
private javax.swing.JPanel jPanel2;
// End of variables declaration
}

Clase Procedimientos

Esta clase contiene el archivo Util.java y su estructura es la siguiente:

/**
* @package: procedimientos
* @class: Util
* @author: Ricardo Rosero
* @version: 1.0
*/
package procedimientos;

/**
* @librerias importadas
* @author: Ricardo Rosero
*/
import com.griaule.grfingerjava.FingerprintImage;
import com.griaule.grfingerjava.GrFingerJava;
import com.griaule.grfingerjava.GrFingerJavaException;
import com.griaule.grfingerjava.IFingerEventListener;
import com.griaule.grfingerjava.IImageEventListener;
import com.griaule.grfingerjava.IStatusEventListener;
import com.griaule.grfingerjava.MatchingContext;
import com.griaule.grfingerjava.Template;
import com.mysql.jdbc.Blob;
import interfaz.PantallaPrincipal;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;
import java.io.InputStream;

public class Util implements IStatusEventListener, IImageEventListener,


IFingerEventListener{
/**
* @atributos
* @author: Ricardo Rosero
* @access: public y private
*/
/**Contexto utilizado para la captura, extracción y coincidencia de huellas digitales */
private MatchingContext fingerprintSDK;
/**Interfaz de usuario donde se muestra la imagena de la huella*/
private PantallaPrincipal ui;
/** Indica si la plantilla o template debe ser extraída automáticamente*/
private boolean autoExtract = true;
/** Arreglo que contiene localmente los datos de las huellas capturadas */
private ByteArrayInputStream fingerprintData, fingerprintData2;
/**Arreglo que contiene la longitud del dato de la huella*/
private int fingerprintDataLength, fingerprintDataLenght2;
/** La imagen de la última huella digital capturada. */
private FingerprintImage fingerprint, fingerprint2;
/** La plantilla de la última imagen de huella capturada */
public com.griaule.grfingerjava.Template template, template2;
/** La conexion con la base de datos */
private Connection dbConnection;
/** Consultas SQL */
private PreparedStatement guardarStmt, guardar2;
private PreparedStatement identificarStmt;
private PreparedStatement verificarStmt;
private PreparedStatement verificarDatosUsuario;
private PreparedStatement verificaCedulaUsuario;
private PreparedStatement verificaCedulaHuellaUsuario;
private PreparedStatement verficaHuellaUsuario;

/**
* @function: Util
* @author: Ricardo Rosero
* @access: public
* @return
*/
public Util(PantallaPrincipal ui) {
this.ui = ui;
//Inicializa la conexión a la BD.
initDB();
}

/**
* @function: inicializarCaptura
* @author: Ricardo Rosero
* @access: public
* @return:
*/
public void inicializarCaptura() {
try {
fingerprintSDK = new MatchingContext();
//Inicializa la captura de huella digital.
GrFingerJava.initializeCapture(this);
}
catch (Exception e) {
//Si ocurre un error durante la inicialización se indica con un mensaje y se cierra la
aplicación.
e.printStackTrace();
System.exit(1);
}
}

/**
* @function: initDB
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void initDB() {
try {
//Carga el driver ODBC
Class.forName(“com.mysql.jdbc.Driver”);
//Se conecta a la bd
dbConnection =
DriverManager.getConnection(“jdbc:mysql://localhost:3306/huellas”,”root”,
“rrosero1980″);
Statement stm = dbConnection.createStatement();
//Prepara las consultas/sentencias que se utilizarán
guardarStmt = dbConnection.prepareStatement(“INSERT INTO
huella(identificacion_usuario, nombres_usuario, huella1_usuario, huella2_usuario)
values(?,?,?,”)”);
guardar2 = dbConnection.prepareStatement(“update huella set huella2_usuario=?
where (identificacion_usuario=?)”);
identificarStmt = dbConnection.prepareStatement(“SELECT nombres_usuario,
huella1_usuario, huella2_usuario FROM huella”);
verificarStmt = dbConnection.prepareStatement(“SELECT huella1 FROM huella
WHERE nombres_usuario=?”);
verificarDatosUsuario = dbConnection.prepareStatement(“select * from huella where
identificacion_usuario=?”);
verificaCedulaUsuario = dbConnection.prepareStatement(“select
identificacion_usuario from huella where (identificacion_usuario=?)”);
verificaCedulaHuellaUsuario = dbConnection.prepareStatement(“select
identificacion_usuario, huella1_usuario from huella where
(identificacion_usuario=?)”);
verficaHuellaUsuario = dbConnection.prepareStatement(“selec * from huella where
(huella1_usuario=?)”);
}
catch (Exception e) {
e.printStackTrace();
}
}

/**
* @function: destroyDB
* @author: Ricardo Rosero
* @access: private
* @return
*/
private void destroyDB() {
try {
//Se cierran todas las sentencias
guardarStmt.close();
identificarStmt.close();
//Cierra la conexión a la base
dbConnection.close();
}
catch (Exception e) {
e.printStackTrace();
}
}

/**
* @function: setFingerprintSDKNativeDirectory
* @author: Ricardo Rosero
* @access: public
* @return
*/
public static void setFingerprintSDKNativeDirectory(String directorio) {
File directory = new File(directorio);
try {
GrFingerJava.setNativeLibrariesDirectory(directory);
GrFingerJava.setLicenseDirectory(directory);
}
catch (GrFingerJavaException e) {
e.printStackTrace();
}
}

/**
* @function: onSensorPlug
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void onSensorPlug(String idSensor) {
try {
//Comienza la captura con el lector conectado.
GrFingerJava.startCapture(idSensor, this, this);
}
catch (GrFingerJavaException e) {
//Indica si ha ocurrido un error con el lector.
e.printStackTrace();
}
}

/**
* @function: onSensorUnPlug
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void onSensorUnplug(String idSensor) {
try {
GrFingerJava.stopCapture(idSensor);
}
catch (GrFingerJavaException e) {
//Indica si ha ocurrido un error con el lector.
e.printStackTrace();
}
}

/**
* @function: onImageAcquired
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void onImageAcquired(String idSensor, FingerprintImage huellaDigital) {
//Almacena la imagen de la huella
this.fingerprint=huellaDigital;
//Muestra la imagen obtenida
ui.showImage(huellaDigital);
//Muestra la plantilla en la imagen actual
extract();
}

/**
* @function: extrac
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void extract() {
try {
//Extracts a template from the current fingerprint image.
template = fingerprintSDK.extract(fingerprint);
//display minutiae/segments/directions into image
ui.showImage(GrFingerJava.getBiometricImage(template,fingerprint));
}
catch (GrFingerJavaException e) {
e.printStackTrace();
}
}

/**
* @function: guardar
* @author: Ricardo Rosero
* @access: public
* @return
* @throws: GrFingerJavaException
*/
public void guardar() throws GrFingerJavaException{
fingerprintData = new ByteArrayInputStream(template.getData());
fingerprintDataLength = template.getData().length;
String cedula = JOptionPane.showInputDialog(“No. Identificacion:”);
boolean coinciden = false;
try{
verificaCedulaHuellaUsuario.setInt(1, Integer.parseInt(cedula));
ResultSet rs = verificaCedulaHuellaUsuario.executeQuery();
//ResultSet rs2 = verficaHuellaUsuario.executeQuery();
//Si se encuentra el nombre en la base de datos
if(rs.next()){
//Lee la plantilla de la base de datos
byte templateBuffer[] = rs.getBytes(2); //.getBytes(2);
//Crea una nueva plantilla
Template referenceTemplate = new Template(templateBuffer);
//compara las plantilas (actual vs bd)
coinciden = fingerprintSDK.verify(template,referenceTemplate);
if(coinciden){
JOptionPane.showMessageDialog(null, “La huella ya existe, coloque un dedo
diferente”);
}
else{
guardar2.setBinaryStream(1, fingerprintData, fingerprintDataLength);
guardar2.setInt(2, Integer.parseInt(cedula));
guardar2.execute();
JOptionPane.showMessageDialog(null, “Ha guarado la huella de backup”);
}
}
else if(!rs.next()){
String nombre = JOptionPane.showInputDialog(“Nombre y Apellido:”);
guardarStmt.setInt(1,Integer.parseInt(cedula));
guardarStmt.setString(2,nombre);
guardarStmt.setBinaryStream(3, fingerprintData, fingerprintDataLength);
guardarStmt.execute();
JOptionPane.showMessageDialog(null, “La huella ha sido guardada con exito”);
}
}
catch(SQLException sqlEx){
sqlEx.printStackTrace();
System.out.println(“Se produjo el siguiente error: “+sqlEx.getMessage());
}
}

/**
* @function: onFingerDown
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void onFingerDown(String idSensor) {
}

/**
* @function: onFingerUp
* @author: Ricardo Rosero
* @access: public
* @return
*/
public void onFingerUp(String arg0) {
}

/**
* @function: onFingerUp
* @author: Ricardo Rosero
* @access: public
* @return
* @throws: GrFingerJavaException
*/
public void identificarPersona() throws GrFingerJavaException{
try{
//Obtiene todas las huellas de la bd
ResultSet rsIdentificar = identificarStmt.executeQuery();
//Si se encuentra el nombre en la base de datos
while(rsIdentificar.next()){
byte templateBuffer[] = rsIdentificar.getBytes(“huella1_usuario”);
Template referenceTemplate = new Template(templateBuffer);
if(referenceTemplate!=null){
//Lee la plantilla de la base de datos
boolean coinciden = fingerprintSDK.verify(template,referenceTemplate);
//Si encuentra correspondencia dibuja el mapa e indica el nombre de la persona que
coincidió.
if (coinciden){
JOptionPane.showMessageDialog(null, “Bienvenido
“+rsIdentificar.getString(“nombres_usuario”));
return;
}
}
}
//Si no encuentra alguna huella que coincida lo indica con un mensaje
JOptionPane.showMessageDialog(null, “No existe ningún registro que coincida con la
huella.”);
}
catch (SQLException e) {
System.out.println(“Se produjo el siguiente error: “+e.getMessage());
e.printStackTrace();
}
catch(GrFingerJavaException gr){
System.out.println(“Error con el scanner: “+gr.getMessage());
gr.printStackTrace();
}
}
}

Cabe recordar que esta clase es la más importante de todas, debido a que en esta clase
procedemos a conectar nuestro sistema de autenticacion con el motor de bases de datos
mySQL.

Clase LectorHuella

Esta clase es la más sencilla de todas, y contiene el archivo Main.java , la función de


esta clase es simple, se encarga de ejecutar nuestro programa, y su estructura es la
siguiente:

/**
* @package: lectorhuellas
* @class: Main
* @author: Ricardo Rosero
* @version: 1.0
*/
package lectorhuellas;

/**
* @librerias importadas
* @author: Ricardo Rosero
*/
import interfaz.PantallaPrincipal;
import java.io.File;
import procedimientos.Util;

public class Main {


/**
* @function: main
* @author: Ricardo Rosero
* @access: public
* @param: args argumentos de la funcion
* @return
*/
public static void main(String[] args) {
String grFingerNativeDirectory = new File(“.”).getAbsolutePath();
Util.setFingerprintSDKNativeDirectory(grFingerNativeDirectory);
PantallaPrincipal p = new PantallaPrincipal();
}
}

Como pueden observar en cada una de las clases importamos la


librería com.griaule.grfingerjava.*; , este paquete es pago, y hace parte del
FingerprintSDK2009 de la empresa Griaule Biometrics. Actualmente es el mejor SDK
para la compilación de sistemas de autenticacion basados en huella digital, este paquete
tiene la capacidad de comparar 35 mil huellas por segundo.

La estructura de nuestra base de datos en mySQL es la siguiente:

– ——————————————————–
– Host: 127.0.0.1
– Server version: 5.1.36-community – MySQL Community Server (GPL)
– Server OS: Win32
– HeidiSQL version: 7.0.0.4053
– Date/time: 2012-03-29 13:47:53
– ——————————————————–

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT


*/;
/*!40101 SET NAMES utf8 */;
/*!40014 SET FOREIGN_KEY_CHECKS=0 */;

– Dumping database structure for huellas


DROP DATABASE IF EXISTS `huellas`;
CREATE DATABASE IF NOT EXISTS `huellas` /*!40100 DEFAULT CHARACTER
SET latin1 */;
USE `huellas`;
– Dumping structure for table huellas.huella
DROP TABLE IF EXISTS `huella`;
CREATE TABLE IF NOT EXISTS `huella` (
`identificacion_usuario` bigint(20) unsigned NOT NULL,
`nombres_usuario` varchar(250) NOT NULL,
`huella1_usuario` blob NOT NULL,
`huella2_usuario` blob NOT NULL,
PRIMARY KEY (`identificacion_usuario`),
KEY `cedula` (`identificacion_usuario`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
– Data exporting was unselected.
/*!40014 SET FOREIGN_KEY_CHECKS=1 */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

Espero amigos que este pequeño tutotrial de la implementación de un sistema de


autenticación basado en huella digital, utilizando JAVA y mySQL les haya servido para
sus vidas y puedan implementarlo en sus lugares de trabajo.

También podría gustarte