quinta-feira, 4 de fevereiro de 2010

Integração de Biometria usando Java e a Digital Persona One Touch I.D. SDK

Introdução

One Touch SDK é um kit de desenvolvimento da DigitalPersona para autenticação de impressões digitais.

Simplficando, podemos resumir nos seguintes procedimentos:

1- Registro do Template;
2- Captura do Template;
3- Comparação do Registro com a Captura;



Registro do Template é a coleta de uma ou mais impressões digitais para formar um padrão de template que possa ser usado para futuras comparações (match). É ela que vamos guardar em alguma base de dados.

Captura do Template é a coleta de uma digital para formação de um template e comparação com outro template que já temos em uma base de dados.

Comparação do Registro com a Captura é o processo de verificação se o Registro feito anteriormente "casa" (match) com o Capturado. (Autenticação Um para Um)
Existe outro processo chamado Um para Muitos.


O que é necessário ?

1- Faça o download da One Touch SDK

2- Você vai precisar de um leitor de impressões digitais da DigitalPersona*. Utilizei o Leitor U.are.U 4000B:


*Caso você já tenha leitores de outros fornecedores ou não queira utilizar os da DigitalPersona, você terá que utilizar outras SDK como a Griaule - Fingerprint SDK, só preste atenção na questão do licenciamento.


Desenvolvimento

Para uma aplicação web, você pode desenvolver uma applet para efetuar o registro e captura das digitais e enviar como um campo normal de texto para servidor. Essa applet também pode ser disponibilizada para aplicações clientes para enviar o template no padrão da sua aplicação e assim, com todos os requisitos de segurança necessários.



Registro do Template

Trecho para efetuar o registro da digital:

DPFPEnrollmentControl newContentPane = new DPFPEnrollmentControl();
newContentPane.addEnrollmentListener(new DPFPEnrollmentListener() {
 @Override
 public void fingerDeleted(DPFPEnrollmentEvent evento)
   throws DPFPEnrollmentVetoException {
  // ...
 }

 @Override
 public void fingerEnrolled(final DPFPEnrollmentEvent evento)
   throws DPFPEnrollmentVetoException {
  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    dispareAoCapturar(evento.getTemplate());
   }
  });
  evento.setStopCapture(true);
 }
});
this.setLayout(new BorderLayout());
this.add(newContentPane, BorderLayout.CENTER);


Agora é só implementar o método dispareAoCapturar. Ele recebe um objeto do tipo DPFPTemplate, que tem um método serialize() que retorna um array de bytes.

Você pode implementar um Listener integrando a Applet com o Javascript de um página e receber o evento da applet:

private void dispareAoCapturar(DPFPTemplate template) {
    if(listener != null) {
        listener.aoObterTemplate(Util.bytesToHex(template.serialize()));
    }
}

...

public interface TemplateListener {
    void aoObterTemplate(String template);
}

...

public class MainApplet extends JApplet implements TemplateListener {

    @Override
    public void aoObterTemplate(String template) {
        try {
            // dispando para o javascript
            JSObject win = JSObject.getWindow(this);
            win.call("aoObterTemplate", new Object[] { template });
        } catch (Exception e) {
            // TODO: tratar exception dentro da applet
            e.printStackTrace();
        }
    }
        
} 
...

Página:

function aoObterTemplate(template) {
 document.getElementById("formulario:template").value = template;
}


Estou transformando o array bytes em uma String no formato Hexa para melhor trafegar dentro do request e ficar mais simples a sua manipulação, mas você pode usar qualquer outro formato (base64, decimal, etc). Nesse momento, você também pode incluir algum algoritmo de encriptação no template.


Captura do Template


O mesmo pode ser feito para efetuar a captura da digital:

try {
 // lista de leitores instalados na maquina
 DPFPReadersCollection readers = DPFPGlobal.getReadersFactory()
   .getReaders();

 // inicializa o objeto capture
 DPFPCapture capturer = DPFPGlobal.getCaptureFactory()
   .createCapture();
 capturer.setReaderSerialNumber(readers.get(0).getSerialNumber());
 capturer.setPriority(DPFPCapturePriority.CAPTURE_PRIORITY_LOW);

 // adiciona um listener para observer ao capturar uma digital
 capturer.addDataListener(new DPFPDataListener() {
  public void dataAcquired(final DPFPDataEvent e) {
   if (e != null && e.getSample() != null) {
    SwingUtilities.invokeLater(new Runnable() {
     public void run() {
      dispareAoCapturar(e.getSample());
     }
    });
   }
  }
 });
 capturer.startCapture();
} catch (Exception e) {
 e.printStackTrace();
 throw new RuntimeException(e);
}


IMPORTANTE: a linha que define a prioridade é importantíssimo para o que o código funcione.


Comparação dos Templates

Chegando o request no servidor podemos efetuar a comparação dos templates:

public class VerificadorImpl implements Verificador {

 private static DPFPVerification verificator = DPFPGlobal.getVerificationFactory().createVerification();

 public boolean verifique(String registrado, String capturado) {
  DPFPFeatureSet features = DPFPGlobal.getFeatureSetFactory().createFeatureSet(hexToBytes(capturado));

  if(features != null) {
   DPFPVerificationResult result =
     verificator.verify(features, DPFPGlobal.getTemplateFactory().createTemplate(hexToBytes(registrado)));
   return(result.isVerified());
  } else return(false);
 }

 ...

}


Questões de segurança

Request - utilize alguma forma de token dentro da digital para que ela não possa ser reusada.

Leitor - dentro do template também existem informações sobre serial do leitor, qualidade da imagem, etc, assim você usar esses detalhes para aumentar a segurança.

Imagem capturada- houveram casos de fraude usando uma película em cima do leitor, assim, utilize alguma forma de checksum da imagem com um pequeno histórico de algumas N imagens já utilizadas anteriormente, assim você aumenta um pouco mais a segurança do template gerado.


Negócio

Qualquer sistema que se utilize de impressões digitais deve se preocupar com isenções, auditoria de isenções e o perfil das pessoas que será utilizado essa tecnologia. Outra forma de autenticação de contigência deve está disponível no sistema caso a biométrica não esteja operando, como cartões, usuário e senha, etc.

Nesse exemplo estamos armazendo um template no formato proprietário da Digital Persona, ou seja, não estamos guardando a imagem da digital e sim, um padrão matemático da imagem. Existem alguns conversores para o formato ISO, mas não disponibilizados até o momento pela Digital Persona.


Conclusão

A autenticação biométrica nos sistemas tente aumentar cada mais e entender os detalhes de implementação é fundamental.

Assim, de forma simplificada foi mostrado como usar uma SDK de Biometria fazendo o registro, captura e comparação dos templates. A SDK da Griaule também usa esse método de espera de eventos do hardware, não sendo muito difícil migrar ou mesmo generalizar esse processo para outras SDK.

Solução

Procurando uma solução completa e fácil de integrar. Veja os exemplos da Naskar BioCloud.

http://biocloud.naskar.com.br/



Referências

Como a biometria funciona
NIST ITL American National Standards for Biometrics
Griaule Biometrics
DigitalPersona