Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Desenvolvendo aplicativo para autenticação biométrica utilizando a Libfprint

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ Desenvolvendo aplicativo para autenticação biométrica utilizando a Libfprint

    Neste tutorial vou explicar como utilizar a libfprint a seu favor, ou seja, desenvolver um software utilizando a mesma para leitura de impressões digitais no Linux.
    Por: Rafael Wagner Souza da Silva

    Entendendo, compilando e executando
    Utilizando leitor biométrico de impressão digital no Linux e desenvolvendo softwares à partir da LibFprint.

    Neste tutorial vou ensinar pela própria experiência, o caminho percorrido para ativar e instalar um leitor biométrico de impressão digital no sistema, além de capturar e gerenciar os erros possivelmente gerados pela má leitura do leitor biométrico da digital.

    Libfprint v0.0.6
    A libfprint é uma biblioteca livre para desenvolvimento de softwares - SDK - que interage com o leitor biométrico de digital através da porta USB. A maior vantagem desta biblioteca é que ela suporta vários modelos de leitores, além de ser livre, claro. No Windows uma biblioteca com o mesmo fim é paga e é cara!

    Instalando a Libfprint
    Existe vários modos de instalar a Libfprint no seu sistema, vou listar aqui o método que utilizei para instalar no Linuxfx Burntux, que é baseado no Debian Testing/Ubuntu.

    Baixar os fontes no site do projeto: Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... (fontes da biblioteca)

    Compilando o fonte:

    $ su - vai pedir a senha do administrador
    # tar -jxvf libfprint-0.0.6.tar.bz2
    # cd libfprint-0.0.6
    # ./configure


    Aqui é que o bicho começa a pegar (Ubuntu, Linuxfx, Debian testing e outros: Dependências!).

    A cada "./configure" o sistema vai informar a dependência que ele necessita para efetuar a compilação com sucesso. Não vou listar as minhas, pois o seu sistema pode ser diferente.

    A solução mais correta neste caso é abrir o Synaptic e instalar manualmente os pacotes procurando e instalando a versão de desenvolvimento, estes pacotes são seguidos de "- dev". Um exemplo bem simples é, se o ./configure reclamar a falta da biblioteca imagemagick, você vai procurar no Synaptic imagemagick e vai encontrar:

    * libmagic++9-dev
    * C++ API to the ImageMagick library - development files
    * Magick++ supports an object model which is inspired by PerlMagick


    Você deve instalar esta biblioteca e executar mais uma vez o ./configure até resolver todos os problemas de dependências.

    Com os problemas de dependência resolvidos, execute o comando "make" para efetuar a compilação na íntegra, a seguir transforme-se em super-usuário para efetuar a instalação da bibliotecas através do comando "make install" seguido do "ldconfig", conforme as instruções abaixo.

    # make
    # make install
    # ldconfig

    Para finalizar este pacote, entre na pasta "example" e execute o comando "make" para compilar os códigos exemplos.

    # cd examples/
    # make


    Aqui você já instalou e configurou a libfprint. Para testar:

    # ./enroll
    # ./verify


    Outro modo, não testado por mim
    Para fazer o fingerprint reader funcionar, você precisará de um repositório que contenha o FPrint. Adicionando o repositório ao seu sources.list:

    # echo -e "# Fingerprint reader support (fprint)\ndeb Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... hardy main restricted universe multiverse" | tee -a /etc/apt/sources.list

    Em seguida instale os pacotes necessários:

    # apt-get update
    # apt-get install fprint-demo libfprint-dev libfprint0 libpam-fprint


    Você precisará estar no grupo de usuários "plugdev" para utilizar o leitor de impressões digitais (FingerPrint Reader):

    # usermod -a -G plugdev $USER
    # groups | grep plugdev
    # sudo chgrp -R plugdev /dev/bus/usb/


    Agora você está pronto para testá-lo. Execute "fprint-demo" para fazer o teste.

    Não garanto que funcione!

    Desenvolvendo um aplicativo para leitura da impressão digital
    Para desenvolver um aplicativo que funcionasse da maneira pedida pelos meus clientes, tive que alterar o código fonte dos dois aplicativos, a modo que a saída de erro pudesse ser capturada pela interface gráfica que eu desenvolvi. Não é nada muito complexo.

    Edite o arquivo enroll.c, localizado na pasta "examples".

    Nesta parte eu editei a saída para uma maneira que eu pudesse capturar os erros, os nomeando de uma forma que se adequasse as minhas necessidades.

    Procure esta parte do código e altere seguindo o meu exemplo:

    Código:
    switch (r) {
       case FP_ENROLL_COMPLETE:
          printf("FIM-OK\n");
          break;
       case FP_ENROLL_FAIL:
          printf("FIM-FALHOU\n");
          return NULL;
       case FP_ENROLL_PASS:
          printf("PASS\n");
          break;
       case FP_ENROLL_RETRY:
          printf("FIM-NOVAMENTE\n");
          break;
       case FP_ENROLL_RETRY_TOO_SHORT:
          printf("FIM-NOVAMENTE\n");
          break;
       case FP_ENROLL_RETRY_CENTER_FINGER:
          printf("FIM-NOVAMENTE\n");
          break;
       case FP_ENROLL_RETRY_REMOVE_FINGER:
          printf("FIM-NOVAMENTE\n");
          break;
    Esta parte é referente ao retorno do resultado do leitor, alterei o que o programa escrito em C retorna ao terminal.

    Esta parte (fp_dev_open(ddev)) é referente a iniciar o leitor, depois que o programa testou a porta, e encontrou o mesmo. Comparando o original, você vai perceber que eu deletei uma parte do código, justamente a que pede que o usuário pressione enter para iniciar o dispositivo, nós não queremos que seja pedido que o dispositivo inicie somente após um "enter".

    Código:
    dev = fp_dev_open(ddev);
       fp_dscv_devs_free(discovered_devs);
       if (!dev) {
          fprintf(stderr, "O FingerFx falhou ao abrir o dispositivo.\nFIM-DISP\n");
          goto out;
       }
    
       printf("O FingerFx iniciou o dispositivo, vamos iniciar o cadastro.\n\n");
       data = enroll(dev);
       if (!data)
          goto out_close;
    
       r = fp_print_data_save(data, RIGHT_INDEX);
       if (r < 0)
          fprintf(stderr, "O FingerFx não conseguiu salvar os dados, erro: %d\n", r);
    
       fp_print_data_free(data);
    O mesmo foi feito com o verify.c:

    Código:
    switch (r) {
       case FP_VERIFY_NO_MATCH:
       printf("A digital não bate com a principal\nFIM-ERRO\n");
       return 0;
          
       case FP_VERIFY_MATCH:
          printf("A sua digital foi gravada \nFIM-OK\n");
          return 0;
       case FP_VERIFY_RETRY:
          printf("Nao foi possível escanear, tente novamente.\nFIM-NOVAMENTE\n");
          break;
       case FP_VERIFY_RETRY_TOO_SHORT:
          printf("Swipe was too short, please try again.\nFIM-NOVAMENTE\n");
          break;
       case FP_VERIFY_RETRY_CENTER_FINGER:
          printf("Por favor, centralize a sua digital no sensor e tente novamente.\nFIM-NOVAMENTE\n");
          break;
       case FP_VERIFY_RETRY_REMOVE_FINGER:
          printf("Por favor, remova seu dedo do sensor e tente novamente.\nFIM-NOVAMENTE\n");
          break;
       }
    } while (1);
    e na sequência:

    Código:
    r = fp_init();
       if (s < 0) {
          fprintf(stderr, "O FingerFX falhou ao iniciar o driver do leitor\nFIM-DISP\n");
          exit(1);
       }
    
       discovered_devs = fp_discover_devs();
       if (!discovered_devs) {
          fprintf(stderr, "O FingerFx não consegue encontrar o leitor \nFIM-DISP\n");
          goto out;
       }
    
       ddev = discover_device(discovered_devs);
       if (!ddev) {
          fprintf(stderr, "O FingerFX não encontrou nenhum leitor instalado!.\nFIM-DISP\n");
          goto out;
       }
    
       dev = fp_dev_open(ddev);
       fp_dscv_devs_free(discovered_devs);
       if (!dev) {
          fprintf(stderr, "O FingerFx não consegue abrir o dispositivo (leitor óptico).\nERRO-NCONECTADO\n");
          goto out;
       }
    
       printf("O FingerFx esta comparando a digital do dispositivo contra a digital "
          "armazenada...\n");
    
       s = fp_print_data_load(dev, RIGHT_INDEX, &data);
       if (s != 0) {
          fprintf(stderr, "O FingerFx falhou ao carregar a digital armazenada com o erro %d\n", r);
          fprintf(stderr, "Você realmente digitalizou seu dedo antes de executar esta "
             "etapa?\n");
          goto out_close;
       }
    
       printf("A digital armazenada foi carregada e esta pronta para ser testada!\n");
       do {
          char buffer[20];
    
    
          verify(dev, data);
    
    
    /* AQUI EU REMOVI COM UM COMENTÁRIO!!!
    
    
          printf("Verify again? [Y/n]? ");
          fgets(buffer, sizeof(buffer), stdin);
          if (buffer[0] != '\n' && buffer[0] != 'y' && buffer[0] != 'Y')
    
    */
             break;
    
       } while (1);
    Depois de todas estas alterações eu executo o sistema e ele me retorna assim:

    # ./enroll.c | grep FIM

    Se tudo OK com a leitura, o programa só retorna:

    FIM-OK

    Se der algo errado como por exemplo um erro de dispositivo ele retorna.

    FIM-ERRO

    ou FIM-(e o erro referente)

    Você pode incluir o código dos arquivos diretamente no fonte do seu programa.

    Assim você pode capturar até erros específicos utilizando estes códigos de erro personalizados!

    Comparação da digital:

    A Libfprint ainda não compara várias digitais, no caso - não tenho certeza, estou deduzindo - o leitor compara via hardware uma digital salva com o comando enroll e retorna o resultado, pois eu já li toda a documentação da libfprint e em momento algum é mencionado alguma herança ou objeto do cabeçalho que exerça tal função.

    O arquivo binário contendo os dados da digital para comparação é salvo dentro da pasta /.fprint/prints/0002/00000000 do diretório do usuário que executou o comando. O arquivo com a imagem da digital é salvo na pasta home do usuário. Se você quiser alterar o nome do arquivo que é gerado, pode mudar no fonte do enroll e verify.

    Nós da Linuxfx estamos desenvolvendo um aplicativo livre que pode comparar via software os binários salvos pela libfprint e retornar um boolean. Mas por enquanto ainda está em testes.

    Eu gravei um vídeo demonstrando nosso sistema para automação de portaria utilizando a biometria digital, o FingerFX:

    * Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... (feito em formato livre OGG)
    * Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... (plugin OGG para os usuários que ainda utilizam Windows)


    Espero que este artigo ajude os programadores que estão tendo dor de cabeça para entender/utilizar a biblioteca libfprint no Linux.

    Fonte: vivaoLinux
    Postado Por: RedDeviL

  • Font Size
    #2
    Muito interessante!
    Não tinha ouvido falar sobre tal biblioteca,meus sinceros agradecimentos por apresenta-la!!!

    Comment


    • Font Size
      #3
      Boa tarde Red Devil,
      Estive olhando o vídeo do sistema de vocês, que linguagem de programação você usou para desenvolver a parte gráfica?
      Parabén pelo post!!!

      Comment


      • Font Size
        #4
        muito bom ja tinha ouvido mais ñ tinha estudado vou ver aki pra fazer um congelamento no meu note via biometria ai fico com mais segurança...
        sigpic

        Comment


        • Font Size
          #5
          Colega, pode me dizer o leito que usou? Estou desenvolvendo meu TCC e tenho a ideia de utilizar um leitor biometrico.

          Gostaria de um leitor que fosse compativel com essa biblioteca, com Windows e Linux


          Valeu!

          Comment


          • Font Size
            #6
            Cara, meus parabéns por tudo! Pelo post, pela forma de escrever e pelo teu trabalho na FingerFX!!! Dei uma olhada no video e me impressionei com o software, pois é exatamente algo assim que eu pensava em (tentar) começar a desenvolver pra um projeto do meu curso.

            É justamente por necessidade acadêmica que achei teu post e que, agora, te escrevo pedindo uma ajuda: teu post foi único material que se encaixa perfeitamente no meu projeto que achei na net... tu poderia me dar alguma ajuda, tipo ser até meu orientador, quem sabe, no meu projeto? Claro que todas as menções e honrarias serão feitas a todos que, de alguma forma, contribuirem com o projeto! Além de que devo aprender a usar a Libfprint pra acesso biométrico no meu sftw não sei mais muita coisa, entende? Teria como me dar um 'caminho das pedras'? Caso sim, falamos mais em detalhes.

            Obrigado e um abraço!

            Comment


            • Font Size
              #7
              Olá,

              primeiramente obrigado, ótimo tutorial. Tive um problema na hora de executar os exemplos, ta dando esse erro aqui:
              Código:
              Found device claimed by UPEK Eikon 2 driver
              libusbx: error [op_open] libusbx couldn't open USB device /dev/bus/usb/002/007: Permission denied.
              libusbx: error [op_open] libusbx requires write access to USB device nodes.
              async:error [fp_async_dev_open] usb_open failed, error -3
              Could not open device.
              Será que alguém pode me dizer como resolver isso?

              Comment


              • Font Size
                #8
                Olá,

                achei meu erro, era só por "sudo ./enroll"

                Comment


                • Font Size
                  #9
                  muito bom, fiz umas pesquisas e nao achei tutorial sobre biometria tao mastigado assim, flw nego

                  Comment

                  X
                  Working...
                  X