Dinâmica da Digitação Aplicada a Ambientes Web - Projetos

Propaganda
1
RODRIGO SERVIUC PAVEZI
Dinâmica da Digitação Aplicada a Ambientes Web
Orientador:
Prof. Dr. rer.nat. Aldo von Wangenheim
Florianópolis, 2007
2
RODRIGO SERVIUC PAVEZI
Dinâmica da Digitação aplicada a um ambiente WEB
Projeto de Pesquisa para elaboração do
Trabalho de Conclusão de Curso apresentado
como exigência para a obtenção do título de
Bacharel em Ciências da Computação à
Universidade Federal de Santa Catarina UFSC, no curso de Ciências da Computação.
Orientador:
Prof. Dr. rer.nat. Aldo von Wangenheim
BACHARELADO EM CIÊNCIAS DA COMPUTAÇÃO
DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA - INE
CENTRO DE TECNOLÓGICO - CTC
UNIVERSIDADE FEDERAL DE SANTA CATARINA - UFSC
Florianópolis, 2007
3
Trabalho de conclusão de curso sob o título “Dinâmica da digitação aplicada a um
ambiente WEB”, defendido por Rodrigo Serviuc Pavezi sob aprovação, em Florianópolis,
Santa Catarina, pela banca examinadora constituída:
Prof. Dr. rer.nat. Aldo von Wangenheim
Departamento de Informática e Estatística - INE
Orientador
M.Sc. Rafael Andrade
Departamento de Informática e Estatística - INE
M.Sc. Rafael Simon Maia
Departamento de Informática e Estatística - INE
4
“Artificial Intelligence: the art of
making computers that behave like the ones
in movies.”
Bill Bulko
5
SUMÁRIO
LISTA DE FIGURAS.................................................................................................................................................. 6
LISTA DE TABELAS ................................................................................................................................................. 7
RESUMO...................................................................................................................................................................... 8
ABSTRACT.................................................................................................................................................................. 9
1.INTRODUÇÃO....................................................................................................................................................... 10
1.1 CONTEXTO ..................................................................................................................................................... 10
1.2 OBJETIVOS ..................................................................................................................................................... 12
1.2.1 OBJETIVO GERAL ................................................................................................................................... 12
1.2.2 OBJETIVOS ESPECÍFICOS ..................................................................................................................... 12
1.3 METODOLOGIA ............................................................................................................................................. 13
1.3.1 ETAPAS DO DESENVOLVIMENTO ........................................................................................................ 13
1.4 JUSTIFICATIVA.............................................................................................................................................. 14
1.5 SISTEMA FOCO PARA O TRABALHO......................................................................................................... 14
1.4 MOTIVAÇÃO .................................................................................................................................................. 15
2 BASE TEÓRICA .................................................................................................................................................... 16
2.1 BIOMETRIA..................................................................................................................................................... 16
2.2 DINÂMICA DA DIGITAÇÃO ......................................................................................................................... 22
2.3 TÉCNICAS DE CLASSIFICAÇÃO ................................................................................................................. 26
2.3.1 K-NEAREST NEIGHBOR ......................................................................................................................... 28
2.3.1 CENTRÓIDE............................................................................................................................................. 30
3 DESENVOLVIMENTO......................................................................................................................................... 32
3.1 TECNOLOGIAS UTILIZADAS ...................................................................................................................... 32
3.2 FERRAMENTAS UTILIZADAS ..................................................................................................................... 33
3.2 PROCESSO DE ANÁLISE............................................................................................................................... 34
3.2.1 VISÃO GERAL DO SISTEMA ................................................................................................................... 34
3.2.2 ALGORITMOS DE CLASSIFICAÇÃO...................................................................................................... 36
3.2.2 ARQUITETURA ........................................................................................................................................ 36
3.2.3 LEVANTAMENTO REQUISITOS ............................................................................................................. 37
3.2.3 CASOS DE USO........................................................................................................................................ 38
3.2.4 DIAGRAMA DE CLASSE.......................................................................................................................... 39
4 IMPLEMENTAÇÃO.............................................................................................................................................. 42
4.1 CONSIDERAÇÕES SOBRE A IMPLEMENTAÇÃO ..................................................................................... 42
4.1.1 APPLET CLIENTE DE ACESSO .............................................................................................................. 43
4.1.2 APPLET CLIENTE DE TREINAMENTO.................................................................................................. 43
4.2 AVALIAÇÃO ................................................................................................................................................... 44
4.3 RESULTADOS................................................................................................................................................. 46
4.4 ANÁLISE.......................................................................................................................................................... 51
4.4.1 TÉCNICAS DE CLASSIFICAÇÃO............................................................................................................ 51
4.4.2 OPINIÃO DOS USUÁRIOS ...................................................................................................................... 52
5 CONCLUSÃO......................................................................................................................................................... 53
REFERÊNCIAS....................................................................................................................................................... 564
ANEXO A – CÓDIGO FONTE DA APLICAÇÃO ............................................................................................ 5691
ANEXO B - ARTIGO................................................................................................................................................ 91
6
LISTA DE FIGURAS
FIGURA 1 - NÍVEL DE SEGURANÇA VERSUS CUSTO DE IMPLANTAÇÃO. ...................................................................... 18
FIGURA 2 - LINHAS DOS ERROS DE AVALIAÇÃO. ......................................................................................................... 21
FIGURA 3 - CAPTURA DOS TEMPOS DA DIGITAÇÃO. .................................................................................................... 24
FIGURA 4 - UM PADRÃO XU E SEUS VIZINHOS MAIS PRÓXIMOS.................................................................................. 29
FIGURA 5 – CIRCUNFERÊNCIA COM CENTRÓIDE E RAIO. ............................................................................................ 31
FIGURA 6 – PADRÃO CLASSIFICADO COMO NÃO VÁLIDO. ........................................................................................... 31
FIGURA 7 – PADRÃO CLASSIFICADO COMO VÁLIDO. ................................................................................................... 31
FIGURA 8 - DIAGRAMA DE ATIVIDADES DO SISTEMA. .................................................................................................. 35
FIGURA 9 - ARQUITETURA DO SISTEMA....................................................................................................................... 37
FIGURA 10 - DIAGRAMA DE CLASSES DO MÓDULO CLIENTE. ...................................................................................... 40
FIGURA 11 - DIAGRAMA DE CLASSE DO MÓDULO SERVIDOR. ..................................................................................... 41
FIGURA 12 – DIFERENÇA DO ERRO FAR ENTRE OS TESTES DE 5 E 10 REPETIÇÕES COM O K-NN. ......................... 47
FIGURA 13 - DIFERENÇA DO ERRO FAR ENTRE OS TESTES DE 5 E 10 REPETIÇÕES COM O CENTRÓIDE................. 48
FIGURA 14 – COMPARAÇÃO ENTRE OS RESULTADOS DOS CLASSIFICADORES NO TREINO COM 5 REPETIÇÕES....... 49
FIGURA 15 - COMPARAÇÃO ENTRE OS RESULTADOS DOS CLASSIFICADORES NO TREINO COM 10 REPETIÇÕES. .... 50
7
LISTA DE TABELAS
TABELA 1 - COMPARATIVO ENTRE AS POSSÍVEIS TECNOLOGIAS PARA SE UTILIZAR NA IMPLEMENTAÇÃO DA DINÂMICA
DA DIGITAÇÃO..................................................................................................................................................... 33
TABELA 2 - CASO DE USO DO CADASTRAR USUÁRIO. ............................................................................................... 38
TABELA 3 - CASO DE USO DO VALIDAR USUÁRIO. ..................................................................................................... 39
TABELA 4 - RESULTADOS DOS TESTES COM O K-NN. ................................................................................................. 46
TABELA 5 - RESULTADOS DOS TESTES COM O CENTRÓIDE. ...................................................................................... 47
8
RESUMO
A grande maioria dos sistemas de informação, que necessitam de autenticação por
usuário, utiliza os dados: usuário e senha, como processo de autenticação. Com a
evolução do meio de comunicação e principalmente da Internet, tal processo tornou-se
não mais tão seguro. O grande problema desse processo de segurança tem sido a perda
ou o roubo dos dados de autenticação. Com isso, dando a chance de um indivíduo não
autorizado acessar o sistema com o nome de usuário e senha de um verdadeiro usuário
do sistema. Foi pensando nesse problema e, em alguma forma de resolvê-lo, que neste
trabalho foi feito um estudo e a implementação da técnica biométrica, dinâmica da
digitação (Keystroke dynamics), a qual serviu de base para a criação de um sistema de
segurança aplicado a um ambiente WEB. O sistema implementado é um sistema de
autenticação de usuário que foi implementado utilizando a tecnologia applet e dois
algoritmos de classificação: k vizinhos mais próximos(K-nearest neighbor) e algoritmo do
Centróide.
Palavras-chave: Dinâmica da digitação. Vizinho mais próximo. WEB. Applet. RMI.
Centróide
9
ABSTRATC
The great majority of the information systems, that need authentication for user,
uses the data: user and password, as authentication process. With the evolution of the
media and mainly of the Internet, such process became not more so safe. The great
problem of this process of security has been the loss or the robbery of the authentication
data. With this, giving the possibility of a not authorized individual to have access the
system with the user name and password of a true user of the system. It was thinking
about this problem and, in some form to decide it, that in this work a study was made and
the implementation of the biometric technique, Keystroke dynamics, which served of base
for the creation of a system of security applied to an environment WEB. The implemented
system is a system of user authentication that was implemented using the technology
applet and two algorithms of classification: K-nearest neighbor and Centroid algorithm.
Key-words: Keystroke dynamics. K-nearest neighbor. WEB. Applet. RMI. Centroid
10
1.INTRODUÇÃO
1.1 CONTEXTO
Pessoas que utilizam a Internet em seu cotidiano necessitam de bons níveis de
segurança para proteger as informações que estão sendo acessadas. Quando
acessamos nossa caixa de e-mail, temos que ter a segurança de que somente nós é que
podemos acessar ela, pois ninguém quer que outras pessoas tenham acesso a nossas
informações. Esta segurança deve ser oferecida pelos sistemas que guardam e
gerenciam tais informações, com o foco principal para os que estão presentes na
Internet, onde o acesso é compartilhado por diversas pessoas. Alguns desses sistemas:
prontuário eletrônico, banco on-line e gerenciadores de e-mail.
Na grande maioria dos sistemas hodiernos, usuários são autenticados através do
par: nome de usuário e senha. O grau de segurança dessa autenticação depende da
complexidade da senha escolhida pelo usuário, da segurança do sistema operacional
que dá acesso ao sistema e principalmente dos navegadores. Muitos usuários escolhem
senhas pouco complexas, como: data de aniversário, nomes de familiares e seqüências
de números.
Em sistemas que são implementados em cima do ambiente WEB, tem a
necessidade de um módulo de segurança, pois nem toda a informação pode ser
acessada por qualquer usuário que esteja navegando pela Internet. Esse módulo de
segurança vem sendo implementado com a utilização de um simples sistema de
autenticação de usuário. Geralmente essa autenticação é feita através de um par de
valores: nome de usuário e senha. Esse modo de autenticação tem suas vantagens e
11
desvantagens. As vantagens vêm desde a fácil implementação até a fácil utilização pelo
usuário. Já a desvantagem vem da perda do par de valores pelo usuário utilizador ou o
par de valores do usuário utilizador ser roubado por algum individuo malicioso. Como é
um sistema WEB, esse indivíduo malicioso pode acessar o sistema de qualquer lugar do
mundo e a hora que bem quiser.
Alguns sistemas que estão no meio WEB e precisam de um alto nível de segurança,
necessitam de outro meio de autenticação que não sofra com as desvantagens do
processo tradicional citado.
Uma das formas de elevar os níveis de segurança é através do uso de técnicas
biométricas. A utilização das técnicas biométricas tem o objetivo de aumentar a
segurança entre usuários e sistemas.
O custo aliado aos níveis de segurança que serão implantados são requisitos de
extrema importância para sistemas. Por este motivo, analisar qual técnica biométrica se
adapta melhor ao sistema é fundamental para o sucesso do projeto. Uma técnica que
tem um baixo e um nível médio de segurança é a Dinâmica da Digitação.
Dinâmica de digitação tem o objetivo de aumentar a segurança entre usuários e
qualquer tipo de sistemas de informação. Sendo uma das técnicas da Biometria, ela tem
como característica a utilização da fisiologia e do comportamento humano para identificar
a identidade única de um indivíduo. Com a dinâmica de digitação cada usuário será
autenticado conforme o ritmo com que ele digita em um teclado, sendo esse ritmo uma
característica única de cada um.
A dinâmica da digitação necessita de um algoritmo de classificação, sendo o
principal responsável pelo funcionamento dessa e de outras técnica biométrica. Um
classificador é uma entidade que contem um certo tipo de conhecimento. Com esse
12
conhecimento, que ele adquiri durante um treinamento, ele deve ser capaz de classificar.
No caso da dinâmica da digitação o classificador é treinado com os tempos de digitação
de um determinado usuário. Com isso, ele pode classificar se um conjunto de tempos de
digitação é ou não pertencente ao mesmo usuário, o qual foi base para o treinamento.
1.2 OBJETIVOS
1.2.1 OBJETIVO GERAL
O trabalho em questão tem como objetivo central, a utilização da técnica biométrica
dinâmica da digitação como adjetivo no processo de autenticação de sistemas que são
implementados no ambiente WEB.
1.2.2 OBJETIVOS ESPECÍFICOS
Análise do Projeto
Implementar o sistema de autenticação;
Implementar técnicas de classificação;
Fazer testes de validação;
Gerar análises estáticas;
13
1.3 METODOLOGIA
Em conjunto com o estudo da dinâmica da digitação, será feito o estudo dos
métodos ou algoritmos de classificação, utilizando o estado da arte como comparativo.
Obaidat e Sadoun (1999) realizaram um estudo comparativo entre diferentes
técnicas de classificação aplicadas à dinâmica da digitação. Dividiram elas em dois
principais grupos: grupo das técnicas de reconhecimento de padrões e grupo das
técnicas de redes neurais artificiais. Com base em seus estudos, será feita a aplicação da
técnica de reconhecimento de padrão k-nearest neighbor (K-NN, os k vizinhos mais
próximos) e de técnica que utiliza o cálculo do centróide.
A partir dos estudos, será feita a implementação do sistema protótipo, o qual será
um sistema de autenticação de usuários implementado em um ambiente WEB. Tendo
isso em vista, será feito um estudo sobre as tecnologias e formas de implementação que
deverão ser utilizadas no desenvolvimento do sistema.
1.3.1 ETAPAS DO DESENVOLVIMENTO
1. Levantamento de requisitos;
2. Definição de casos de uso;
3. Geração do diagrama de classes;
4. Implementação
5. Validação;
6. Análise.
14
1.4 JUSTIFICATIVA
Todo esse estudo visa à aplicação da dinâmica da digitação em sistemas WEB, os
quais necessitam de uma melhor segurança. Essa aplicação deve garantir a esses
sistemas WEB uma segurança maior, sem a necessidade de um grande investimento, ou
seja, algo de custo baixo, tanto de implementação, como também de utilização.
1.5 SISTEMA FOCO PARA O TRABALHO
Para uma aplicação prática do desenvolvimento do trabalho será utilizado um
sistema protótipo. Mas o sistema que motiva esse trabalho é um sistema de prontuário
eletrônico, o qual é projetado para o ambiente WEB. Esse sistema tem como prioridade o
requisito de segurança dos dados que ele armazena.
Os usuários que terão acesso ao sistema, são na grande maioria pessoas que
trabalham na área hospitalar, por isso, a grande preocupação com a restrição de acesso.
O sistema em si trabalhará com informações a respeito de pacientes que contenham um
prontuário cadastrado no hospital.
Pelo fato desse sistema ser um sistema WEB, todo cuidado com a segurança deve
ser tomado, pois não será necessário o acesso físico para a utilização do mesmo, assim
facilitando o acesso de intrusos e de pessoas não autorizadas.
15
1.4 MOTIVAÇÃO
Sistemas de informação WEB estão, cada vez mais, se tornando vulneráveis a
invasões de intrusos. Isso nos motiva a estudar técnicas que possam vir a ajudar na
segurança desses sistemas. Principalmente para garantir a segurança dos usuários
utilizadores.
Também temos um grande interesse em nos especializar na área de do
Aprendizado de Máquinas. Pois toda a teoria que vamos estudar e colocar em prática,
pode ser facilmente utilizada em problemas de áreas diversas.
16
2 BASE TEÓRICA
Para andamento do trabalho tivemos que fazer estudar alguns trabalhos já
realizados em tono do mesmo assunto. Como também dos conceitos que envolvem o
projeto em geral. Neste capitulo é feita uma explanação sobre essa teoria.
2.1 BIOMETRIA
De acordo com Faundez-Zanuy (2006), a palavra biometria vem das palavras
gregas: “bios” (vida) e “metrikos” (medida). Ou seja, uma ciência que envolve uma análise
estatística das características biológicas, estudando as características físicas e
comportamentais do ser humano com o intuito de identificá-lo. As que utilizam as
características físicas do ser humano são: impressão digital, íris, retina, etc. E que
utilizam as características comportamentais temos: dinâmica da digitação e o
reconhecimento da assinatura.
Com todo esse estudo sobre o corpo humano, podemos capturar a biometria das
pessoas, e com isso, criar uma aplicação de segurança que analise as características
biológicas e faça uma verificação de uma identidade única do individuo. Esse sistema
nada mais é que um sistema de autenticação de pessoas. Geralmente as pessoas
esperam que um sistema desses não seja invasivo ou constrangedor. Pois suas
características comportamentais ou fisiológicas estão sendo testadas. Então todo cuidado
deve ser tomado quando se está criando um sistema baseado na biometria.
17
Hoje em dia há diversos tipos de biometria, cada tipo com os seus benefícios e suas
desvantagens. Alguns dos tipos são:
Veias da palma da mão;
Impressão digital;
Reconhecimento de face;
Identificação pela íris;
Reconhecimento pela retina;
Reconhecimento de voz;
Geometria da mão;
Reconhecimento da assinatura;
Reconhecimento da digitação.
A Figura 1 mostra as diferenças entre as técnicas biométricas, considerando o custo
e o nível de segurança de cada uma. O nível de segurança influencia diretamente no
custo, pois a técnica que fornece a maior segurança utiliza-se de equipamentos e
tecnologias caras. A identificação pela íris, o reconhecimento da retina e o
reconhecimento da face, são os mais seguros e com isso, os de maior custo. Também
podemos encontrar técnicas de baixo custo, mas com um nível de segurança não tão
elevado.
Tanto o custo como o nível de segurança, são requisitos de grande importância
para sistemas de segurança. Por isso, temos que analisar qual técnica biometria se
adapta melhor ao sistema que estamos criando.
18
Nos anos 90, a tecnologia de reconhecimento de face, com o seu rápido
crescimento e desenvolvimento, acabou saindo dos laboratórios e começou a ser
aplicada em sistemas comerciais. Nos dias de hoje muitos sistemas utilizam o
reconhecimento de face [Phillips et al 2000]. Isso mostra que muita tecnologia que está
ainda nos laboratórios pode vim a ser utilizada comercialmente.
Figura 1 - Nível de segurança versus custo de implantação.
Umas das técnicas biométricas que vem sendo bastante usada é a impressão
digital. Tanto pelo fado dela ser uma técnica de custo acessível, como também, por ter
uma precisão aceitável. Algumas pessoas se sentem desconfortáveis ao usarem a
impressão digital, pelo fato de estar tocando no aparelho.
19
Já outras técnicas como identificação pela íris ou reconhecimento pela retina, são
técnicas de custo elevado, mas que tem uma grande precisão. Um dos fatores do custo
elevado vem da necessidade de um hardware próprio para o sistema, principalmente das
técnicas de biometria física. Já algumas técnicas de biometria comportamental, não
precisam de um hardware próprio. Por exemplo: para o reconhecimento de voz, tem-se a
necessidade de um simples microfone, pois os computadores de hoje em dia já fazem a
captura do sinal da voz em suas placas de som [Magalhães et al. 2005].
Além do custo, outro aspecto que influenciam na hora de se escolher uma técnica
para um sistema, é o fato do constrangimento dos usuários na utilização do sistema.
Alguns usuários se sentem constrangidos ao usar a reconhecimento pela íris. Isso ocorre
pelo fato desses usuários não se sentirem tranqüilos com a luz que passa pelos seus
olhos.
No presente trabalho, será abordada a técnica biométrica de reconhecimento da
digitação, também chamada de dinâmica da digitação. Tanto por ser uma técnica de
baixo custo como também de fácil aplicação em um sistema de acesso a usuário de uma
página na Internet.
Toda técnica biométrica tem as suas vantagens e desvantagens. Pois nenhum
aprendizado de máquina é 100% correto. Sempre se tem uma margem de erro [ Moore
2007]. O importante é saber se essa margem de erro afeta, de maneira considerável, a
utilização do sistema que implementa a técnica biometria. Por exemplo: um sistema de
autenticação não pode aceitar intrusos, como também, não pode rejeitar verdadeiros
usuários do sistema. Tais situações devem ser testadas e analisadas como erros da
técnica implementada.
20
Uma forma de testar uma especifica técnica, é avaliar os erros:
Falsa Aceitação (FAR - False Acceptance Rate): quando um sistema de
autenticação aceita ou autentica um impostor como um usuário cadastrado
no sistema.
Falsa Rejeição (FRR - False Rejection Rate): quando um sistema de
autenticação rejeita um usuário válido cadastrado no sistema.
Os dois tipos de erros valem para a avaliação de qualquer técnica biométrica. A
avaliação é feita através de testes de aceitação, os quais são simulações da utilização do
sistema que aplica a técnica biométrica.
Em um sistema de autenticação as simulações são realizadas com os possíveis
usuários que utilizaram o sistema. Cada usuário deve ser cadastrado no sistema e o
algoritmo de aprendizado de máquina deve aprender o padrão correspondente ao
usuário. Essa fase é chamada de treinamento. Depois do treinamento, o usuário testa se
o sistema reconhece ele como um usuário válido. Se por um acaso o sistema rejeitar o
usuário válido, um erro de FRR é constatado. Um outro teste é feito para verificar o FAR.
Nesse caso, um usuário intruso tenta obter acesso com a sua biometria. Caso ele
obtenha acesso, o erro FAR é constatado.
Após os testes, é feita um analise sobre a porcentagem de ocorrência dos
erros(FRR e FAR). Com a junção desses dois erros(FRR e FAR) podemos gerar um
novo valor conceitual (CER – Cross-Over Error Rate) para avaliar as técnicas
biométricas. A Figura 2 mostra as linhas dos erros.
A análise dos erros é a forma de validar uma técnica biométrica. Com os erros
podemos avaliar se o sistema está aceitando muitos usuários intrusos ou se ele está
bloqueando muitos usuários verídicos. Dessa forma podemos ajeitar o classificador até
21
que se tenha um valor considerável de erro, assim, não afetando o uso do sistema.
Podemos diminuir ou aumentar os erros, mas é impossível fazer com que não ocorra
nenhum erro. Isso seria um sistema ideal. O que podemos fazer é tentar achar um valor
ótimo para o tipo de aplicação que está se criando.
Figura 2 - Linhas dos erros de avaliação.
22
2.2 DINÂMICA DA DIGITAÇÃO
Jarmo Ilonen (2003) define dinâmica da digitação como uma biometria baseada na
suposição de que pessoas diferentes digitam de maneiras características. Nos seus
estudos, ele também relata que no século 19, os operadores de telégrafo já tinham
padrões de telegrafar, com isso, um operador reconhecia o outro. Isso caracteriza o
marco inicial da idéia de dinâmica da digitação.
Dinâmica da digitação se baseia no modo em que as pessoas digitam, ou seja, no
ritmo de digitação. Isto é, o comportamento de um ser humano diante a uma tarefa. Por
isso a dinâmica da digitação é uma técnica biométrica comportamental e não física.
Conforme Jarmo Ilonen (2003) há várias maneiras de medir a dinâmica da digitação
quando os usuários digitam em um teclado normal de um computador. Algumas das
maneiras são:
• O intervalo de tempo entre o pressionamento de teclas consecutivas;
• O tempo que uma tecla fica pressionada;
• O tempo total da digitação;
• A freqüência da digitação de teclas erradas;
• O hábito de usar teclas diferentes do teclado.
Revett et al. (2005) citado por Magalhães et al. (2005), concluiu que dividindo o
teclado de um computador em setores, reduz-se a taxa de sucesso de impostores (False
Acceptance Rate - FAR). As senhas que tem dígitos em cada setor forçam os usuários a
utilizarem teclas que estão dispersas pelo teclado, garantindo uma melhor captura do
ritmo de digitação dos usuários.
23
Além da forma de captura, tem também o processo de captura, ou seja, o
treinamento do classificador. Temos dois tipos de processos. Em um dos processos se
utiliza a digitação de um texto durante o treinamento [Curtin 2006]. No outro é utilizado a
própria senha cadastrada pelo usuário [Cho 2000].
Os tempos de digitação podem ser adquiridos através de um simples teclado de um
computador normal ou de um telefone. Cada sistema de autenticação tem seus próprios
meios de obter os tempos.
Pelo fato de não precisar de um equipamento dedicado, a técnica de dinâmica da
digitação tem um custo mais baixo dentre as técnicas biométricas. Esse custo baixo
beneficia muitos sistemas que necessitam de um nível médio de segurança, ou seja,
sistemas como: prontuário eletrônico ou qualquer outro tipo de sistemas de informação
que se encontra na Internet, os quais geralmente se utilizam o par de valores: nome de
usuário e senha.
De acordo com [Cavalcanti 2005], o ritmo de digitação dos usuários, podem ser
capturados a partir de duas diferentes medidas que contabilizam o tempo. Uma
contabiliza o tempo que os usuários mantêm cada tecla pressionada. A outra contabiliza
o intervalo de tempo entre uma tecla e outra que são consecutivamente pressionadas.
Essa diferença de capturas do ritmo é demonstrada na Figura 3, onde temos uma
seqüência de letras digitadas durante um espaço de tempo.
Após a captura do ritmo de digitação, os tempos formam um vetor, o qual
caracterizara o padrão do usuário para o sistema classificador. Esse vetor composto
pelos tempos tem um tamanho dependente da quantidade de teclas que foram
pressionadas. Com isso podemos formar uma equação onde, com n teclas pressionadas,
o tamanho do vetor ou a quantidade de tempos vai ser igual a 2n – 1. Por exemplo: uma
24
senha de seis dígitos formará um vetor composto por 11 tempos, sendo que, seis são
tempos de pressionamento de teclas e 5 são intervalos de tempos entre teclas
pressionadas consecutivamente.
Haider, Abbas e Zaidi (2000) em seus estudos utilizam a captura dos tempos de
pressionamento entre as teclas. O padrão de digitação do usuário foi formado por n-1
vetores, sendo n, o número de dígitos que compõe a senha. Cada vetor tem o tamanho
igual ao número de treinos realizados. Por exemplo: um padrão montado a partir de uma
senha de seis dígitos(1a2b3c) com a digitação repetida cinco vezes, seria formado por
cinco vetores e cada um com o tamanho cinco.
Figura 3 - Captura dos tempos da digitação.
Como qualquer processo de identificação através da biometria é dividido em duas
etapas: cadastro do usuário e autenticação do usuário cadastrado. A dinâmica da
digitação também é dividia nessas etapas.
25
No processo de cadastro, o sistema deve treinar o classificador que será utilizado
no processo de autenticação. O classificador depende de um conjunto de treinamento,
esse conjunto pode ser construído de diferentes maneiras. No caso da dinâmica da
digitação o conjunto pode ser construído através da digitação repetitiva de uma
seqüência de dígitos. Cada vez que se termina a digitação de uma seqüência, o vetor de
tempos é adicionado no conjunto de treinamento.
Já no processo de autenticação, o sistema deve receber o vetor de tempos e utilizar
o classificador, previamente gerado na etapa de treino, para classificar.
Como as técnicas biométricas são avaliadas conforme a medição dos erros: FAR,
FRR e CER. A dinâmica da digitação também deve ser analisada e validade a partir
desses erros.
A dinâmica de digitação tem os seus benefícios, mas também tem as suas
desvantagens. O principal benefício é a obtenção de algo mais seguro, mas com um
custo baixo. Como a dinâmica de digitação depende do comportamento do usuário, a
desvantagem vem de que o usuário sempre deve usar o mesmo comportamento. Isso
geralmente não acontece, pois nós seres humanos podemos mudar de comportamento a
qualquer momento em nossas vidas. Essa mudança geralmente é gradativa. Então, o
que se pode fazer para que a dinâmica de digitação não sofra com essa mudança, é a
implementação de um classificador que aprenda com essas mudanças.
26
2.3 TÉCNICAS DE CLASSIFICAÇÃO
Reconhecimento de Padrões (RP) é a ciência que estuda a classificação de objetos,
ou seja, qual quer coisa que possa ser classificada. Essa ciência é estudada juntamente
com Inteligência Artificial (IA). IA tem por objetivo estudar técnicas para que máquinas
como os computadores ou dispositivos que tenham como propriedades o processamento
e o armazenamento, possam ter a habilidade de aprendizagem, ou seja, fazer com que a
máquina tenha uma inteligência própria [McCarthy 2004].
Reconhecimento de Padrões também utilizam técnicas de medidas que servem
para mostrar o quão distante um padrão está de outro. Assim podendo unir essas
medidas para gerar uma função de similaridade entre os padrões.
Um exemplo de reconhecedor de padrões:
[...] O melhor reconhecedor de padrões em a maioria de exemplos são os seres humanos,
contudo nós não compreendemos como os seres humanos reconhecem padrões. (JAIN; ANIL,
DUIN; ROBERT, MAO; JIANCHANG, 2000, p. 1, tradução nossa).
Para a dinâmica da digitação o classificador deve distinguir entre usuários
autênticos e impostores. O tempo de treinamento do classificador é uma característica
importante, pois em sistemas WEB, esse tempo não deve ter um valor elevado.
Haider, Abbas e Zaidi (2000) em seus estudos utilizam a captura dos tempos de
pressionamento entre as teclas. O padrão de digitação do usuário foi formado por n-1
vetores, sendo n, o número de dígitos que compõe a senha. Também se trabalhou com
um classificador que utilizava três diferentes técnicas de reconhecimento de padrões:
lógica fuzzy, redes neurais e métodos estatísticos. As avaliações foram feitas sobre cada
técnica separadamente e sobre a união das três técnicas. Os testes mostraram que a
27
união das três técnicas no processo de classificação obteve um melhor resultado do que
a utilização de qualquer uma delas separadamente. Em relação à utilização em separado
a técnica que obteve o melhor resultado foi à baseada em métodos estatísticos. Foram
feitos dois testes, no primeiro a rejeição de acesso ao sistema na primeira tentativa de
ingresso do usuário era contabilizada como erro, no segundo teste os usuários tinham
duas chances de acesso. Os resultados mostraram que geralmente os usuários válidos
são rejeitados na primeira vez.
No trabalho de Cho (2000), foi desenvolvido um sistema para um ambiente Web, o
qual foi implementado com duas técnicas de classificação: medida de distância do vizinho
mais próximo e uma rede MLP (Multi Layer Perceptron). Os testes foram feitos com 21
usuários que tiveram um número de padrões de treinamento variando entre 76 a 388. Os
resultados apontaram por uma superioridade da rede MLP sobre a medida de distância.
Sendo que foi estabelecido índice de erro para falsa aceitação como 0,0% , a média do
erro para falsa rejeição no caso da MLP foi de 1,0% e da técnica do vizinho mais próximo
foi de 19,5%.
Cavalcanti (2005) mostrou em seu trabalho a típica extração do ritmo de digitação
do usuário. A técnica utilizada foi capturar os tempos de pressionamento de cada tecla e
o intervalo de tempo entre o pressionamento entre cada tecla. Também foi desenvolvido
um sistema que utiliza uma normalização e uma seleção baseada no desvio padrão das
características capturadas. Esses dois passos são feitos antes da aplicação de uma
medida de distância como classificador. . Os resultados mostraram que com o índice de
falsa aceitação igual a zero, o erro falsa rejeição atingiu 6,04% quando utilizadas a
normalização e a seleção. Já sem os dois passos o erro de falsa rejeição atingiu 30,99%.
28
2.3.1 K-NEAREST NEIGHBOR
O K-nn é um algoritmo de aprendizado supervisionado pertencente à área de
reconhecimento de padrões. O algoritmo necessita que os padrões estejam
representados na forma de objetos do espaço dimensional, ou seja, na forma de um vetor
de n dimensões.
O K-nn classifica os padrões através dos k vizinhos mais próximos do conjunto de
treinamento, ou seja, dado um padrão x, são encontrados os k padrões contidos no
conjunto de treinamento mais próximo de x. Diante disto, a classe mais freqüente dentre
os k padrões será atribuída ao padrão x. Para encontrar os k vizinhos mais próximos o
algoritmo utiliza uma técnica de medida de distância, neste caso, a distância euclidiana.
A Figura 4 demonstra essa classificação, sendo que, o ponto Xu é o padrão a ser
classificado e cada seta representa a ligação com os seus vizinhos mais próximos. Neste
caso, como a variável k foi atribuída com o valor 5, o algoritmo K-nn encontrou os cinco
pontos mais próximos de Xu. Sendo que dos 5 mais próximos, quatro pertencem a classe
dos padrões vermelhos e um pertence a classe dos verdes. O padrão Xu será
classificado como um ponto vermelho, pois ele se encontra mais perto dos vermelhos do
que dos demais.
29
Figura 4 - Um padrão Xu e seus vizinhos mais próximos.
A variável k deve ser bem selecionada, pois um k muito alto aumenta a
dissimilaridade entre os padrões, e um k muito pequeno pode fazer com a classificação
não seja confiável.
Para se classificar é preciso construir o classificador, o qual é construído com os
dados do treinamento. Isso torna o K-NN um algoritmo que precisa de uma grande
capacidade de armazenamento.
Para encontrar os k vizinhos mais próximos o algoritmo usa uma técnica de medida
de distância. Há diversas técnicas de medidas de distância, nesse trabalho será usada à
distância euclidiana, que pode ser obtida pela expressão:
30
onde:
DE = Distância Euclidiana.
xi = valor do primeiro ponto.
yi = valor do segundo ponto.
n = número de dimensões.
O fato de K-NN precisar de um tempo pequeno para o treinamento, faz dessa
técnica uma boa alternativa para sistemas WEB, como em nosso caso.
2.3.1 CENTRÓIDE
O centróide é uma forma de representar o ponto central de um conjunto de pontos.
Ou seja, o centróide é o padrão central de um conjunto de padrões representados num
espaço dimensional. A teoria do centróide vem do algoritmo de classificação Kmédias
[MacQueen 1967].
O cálculo do centróide é obtido através da média dos valores que compõe um
padrão. Por exemplo: um conjunto de padrões representado por dois pontos de duas
dimensões X = (x1, x2, x3) e Y = (y1, y2, y3). Então podemos obter o centróide C = (c1, c2,
c3), onde c1 = (x1 + y1)/2 e c2 = (x2 + y2)/2 e c3 = (x3 + y3)/2.
A partir do centróide podemos calcular o raio de uma circunferência que representa
o conjunto de padrões. O raio é obtido através do cálculo da distancia euclidiana entre o
centróide e os padrões que compõe o conjunto. Sendo o raio a distancia do padrão mais
afastado em relação ao centróide.
Com a circunferência podemos classificar um padrão X calculando a distancia entre
ele e o centróide. Se a distancia for menor ou igual ao raio. Então padrão é classificado
31
com pertencente ao conjunto de padrões. Se a distancia for maior que o raio o padrão é
classificado como não pertencente ao conjunto.
A Figura 5 mostra um exemplo de uma circunferência formada por um conjunto de
padrões. Sendo o ponto vermelho o centróide e a linha vermelha o raio da circunferência.
Na Figura 6 é mostrada a classificação de um padrão como não válido. Onde o
ponto amarelo está fora da circunferência. E na Figura 7 é mostrada a classificação de
um padrão como válido, pois se encontra dentro da circunferência.
Figura 5 – Circunferência com centróide e raio.
Figura 6 – Padrão classificado como não válido.
Figura 7 – Padrão classificado como válido.
32
3 DESENVOLVIMENTO
Neste capitulo será apresentado o desenvolvimento do trabalho proposto, levando
em consideração as tecnologias e ferramentas utilizadas e o processo de análise.
3.1 TECNOLOGIAS UTILIZADAS
Para a implementação do presente trabalho foi utilizado a linguagem de
programação orientada a objetos Java, principalmente pela necessidade de se utilizar um
Java applet. De acordo com [Cho 2000], o applet é a melhor tecnologia para ser utilizada,
por ter um baixo custo, ter um linguagem base orientada a objeto e ser multiplataforma.
Outra questão, é que para se capturar os tempos de digitação a partir do navegador é
necessário que a linguagem de implementação tenha uma boa biblioteca de captura de
eventos e outra de calculo de tempo. O applet tem as duas propriedades, pode-se tratar
facilmente os eventos gerados pelo teclado, selecionando as teclas que influenciam na
captura dos tempos. A Tabela 1 mostra uma comparação entre três diferentes
tecnologias conforme.
Para guardar as informações dos usuários cadastrados foi utilizado o banco de
dados postgreSQL. Mas para a conexão entre a aplicação e o banco de dados foi
utilizado um framework Java chamado Hibernate.
O Hibernate é um framework Java que faz a persistência dos objetos da aplicação
para o banco de dados. Ou seja, faz o mapeamento objeto-relacional(MOR). A utilização
do Hibernate torna a implementação mais rápida, pelo fato de abstrair as funções
necessárias para a comunicação com o banco de dados e por conter uma função que
33
cria automaticamente a base de dados. Essa criação automática é feita a partir do prévio
mapeamento das classes que devem ser persistidas.
Para fazer a comunicação entre o applet e o servidor, foi necessário o uso da
tecnologia RMI(Remote Method Invocation). RMI é uma tecnologia usada em aplicações
cliente-servidor. Ele tem como propriedade a invocação de métodos que se encontram na
aplicação servidor. Essa invocação é feita através de uma comunicação socket entre o
cliente e o servidor.
Todas as tecnologias utilizadas são licenciadas como software livre.
Tabela 1 - Comparativo entre as possíveis tecnologias para se utilizar na implementação da
dinâmica da digitação.
3.2 FERRAMENTAS UTILIZADAS
Para o desenvolvimento do trabalho foi utilizada a linguagem de programação Java
e o ambiente de desenvolvimento Eclipse. Para a criação dos diagramas das classes foi
utilizado o software Enterprise Architect.
34
3.2 PROCESSO DE ANÁLISE
O processo de análise se deu da seguinte forma: uma visão geral do sistema, a
arquitetura, o levantamento de requisitos, definição dos casos de uso e a criação dos
diagramas que representam as classes do sistema.
3.2.1 VISÃO GERAL DO SISTEMA
A dinâmica da digitação implementada a um portal WEB tem como vantagem dar
uma maior segurança para o acesso ao portal. O processo dessa implementação é
mostrado na Figura 8. O módulo de autenticação é dividido em dois processos separados
que são divididos em páginas separadas do portal.
Quando um novo usuário necessita cadastrar-se no sistema é necessário que ele
faça um treino, que nada mais é que, a digitação repetitiva da senha que ele mesmo
escolheu. Durante a fase de treino o usuário entra com um nome de usuário e escolhe
uma senha, que deve ser composta por 6 dígitos para o algoritmo K-nn. A digitação deve
ser repetida cinco vezes ou mais. A senha foi limitada em seis dígitos, porque o algoritmo
K-nn precisa que os padrões tenham a mesma quantidade de dimensões. Já para o
algoritmo do centróide a senha não é limitada. Após o treino o padrão de digitação e o
nome do usuário são armazenados no banco de dados.
Usuários que já são cadastrados no sistema devem ir para a tela de acesso. Sendo
necessário que o usuário entre com nome de usuário e a senha, mas a senha deve ser
digitada como foi previamente digitada na situação de treino. No acesso, após a captura
dos tempos na entrada da senha, o sistema procura o usuário no banco de dados e se o
35
usuário existir, então o sistema faz a classificação através da dinâmica de digitação. Se o
usuário for classificado como verdadeiro, então é liberado o acesso ao sistema para o
usuário, senão o sistema rejeita o usuário (Figura 8).
Figura 8 - Diagrama de atividades do sistema.
36
3.2.2 ALGORITMOS DE CLASSIFICAÇÃO
A idéia de desenvolver o algoritmo K-nn vem da tentativa de proporcionar uma
classificação a partir de um confronto entre os padrões treinados. Onde, todos os
padrões capturados de todos os usuários serviram de comparação para a classificação.
Isso faz como que o conjunto dos padrões ou descritor conceitual esteja na memória em
tempo de execução da classificação.
Para a utilização do algoritmo K-nn foi limitado o tamanho da senha em 6 dígitos
pelo fato de a medida de distância utilizada só aceitar padrões de mesma dimensão.
Com isso todos os padrões dos usuários são formados por um vetor de 11 tempos.
Foi analisando as restrições do algoritmo K-nn em relação à limitação do tamanho
da senha, que se iniciou o desenvolvimento do algoritmo do centróide, o qual não
necessita dos padrões de todos os usuários para a classificação. Sendo necessários
somente os padrões individuais de cada usuário.
3.2.2 ARQUITETURA
A Figura 6 demonstra a arquitetura do sistema. Como é um ambiente WEB, temos
uma situação de cliente-servidor, nessa situação temos o navegador na parte cliente, que
contem um applet, o qual se comunica com o servidor através do navegador e de uma
conexão remota com uma aplicação que é um servidor RMI. Esse servidor RMI faz a
conexão com o banco de dados.
37
Figura 9 - Arquitetura do sistema.
3.2.3 LEVANTAMENTO REQUISITOS
Para o projeto do sistema foi feito um levantamento de requisitos, os quais tem a
função de suprir as necessidades de um usuário ao utilizar um sistema de autenticação.
Foram levantados os seguintes requisitos:
Requisito 1: Durante o cadastro do usuário inserir as informações: nome de
usuário e senha, sendo que a senha deve ser repedida para uma
confirmação de igualdade.
Requisito 2: Durante o acesso ao sistema o usuário deve inserir as
informações: nome de usuário e senha, pré-cadastradas durante o cadastro
de usuário.
38
3.2.3 CASOS DE USO
Conforme as características do sistema, foram levantados os seguintes casos de
uso: Cadastrar Usuário e Validar Usuário.
Tabela 2 - Caso de Uso do Cadastrar Usuário.
Caso de Uso: Cadastrar Usuário
Atores
Todos os usuários do sistema.
Finalidade
Cadastrar o usuário no sistema e treinar o
classificador.
Visão Geral
O usuário preenche seus dados: nome e
senha, sendo que a sem ha deve ser
digitada repetidamente para a captura do
ritmo de digitação. Após o preenchimento
pressiona o botão “Treinar”.
Seqüência de eventos:
1. O usuário acessa a tela de treinamento
2. É exibido um formulário contendo o campo: “Nome de usuário” e os campos
para a digitação da senha
3. O usuário preenche o “Nome de usuário”
4. O usuário preenche os campos das senhas, sempre digitando a mesma
senha
5. O usuário pressiona o botão “Cadastrar”
6. Uma tela de confirmação é mostrada para o usuário.
39
Tabela 3 - Caso de Uso do Validar Usuário.
Caso de Uso: Validar Usuário
Atores
Todos os usuários do sistema.
Finalidade
Autenticar o usuário que pede acesso.
Visão Geral
O usuário preenche os campos nome de
usuário e senha e pressiona o botão
“Acessar”.
Seqüência de eventos:
1. O usuário vai para a tela de Acesso.
2. É exibida uma tela contendo dois campos: “Nome de usuário” e “senha”
3. O usuário preenche o campo “Nome de usuário”
4. O usuário preenche o campo “senha”
5. O usuário pressiona o botão “Acessar”
6. Uma tela de confirmação aparece para o usuário, mostrando se ele é um
usuário aceito ou rejeitado.
3.2.4 DIAGRAMA DE CLASSE
A partir dos casos de uso e considerando a arquitetura da aplicação, temos dois
diagramas de classe um para o cliente RMI e outro para o servidor RMI. A Figura 7 e a
Figura 8 mostram os diagramas.
40
Figura 10 - Diagrama de classes do módulo cliente.
41
Figura 11 - Diagrama de classe do módulo servidor.
42
4 IMPLEMENTAÇÃO
4.1 CONSIDERAÇÕES SOBRE A IMPLEMENTAÇÃO
O sistema é composto por duas telas applets e um servidor. Essa divisão foi feita
para tornar a aplicação mais leve, pois quando um applet é chamado pelo navegador,
todas as classes que ele utiliza é baixada para o computador onde ele foi chamado.
Também levamos em consideração a conexão com o banco de dados, que deve ser feita
no servidor e não no cliente.
Através da tecnologia RMI foi possível dividir a aplicação em cliente e servidor.
Sendo assim, foi construída uma interface que é implementada pela classe do servidor e
ao mesmo tempo essa interface tem uma associação com os clientes applets. Com a
utilização do RMI o cliente só troca informações leves com o servidor. Assim foi possível
que os clientes fossem implementados somente com funções de interface gráfica, sem
nenhuma função lógica. Toda a lógica e comunicação com o banco de dados são
responsabilidades do servidor.
As telas applets tiveram que ser compostas por um tratador de eventos, o qual trata
os eventos gerados pelo teclado, assim, inviabilizando a ocorrência de erros durante a
captura do ritmo de digitação de um usuário.
Para a utilização do algoritmo K-nn foi feito o tratamento da quantidade de digito
que a senha é composta, essa quantidade foi definida em 6 dígitos. Como os applets
fazem uma conexão com o servidor através do RMI, foi preciso que eles fossem
assinados digitalmente, pois essa é uma regra de segurança da Máquina Virtual Java.
43
O sistema foi desenvolvido em módulos, os quais são:
Applet cliente de acesso;
Applet cliente de treinamento;
Servidor.
4.1.1 APPLET CLIENTE DE ACESSO
O applet de acesso é uma tela com dois campos, um para o nome do usuário e o
outro para a senha. O campo da senha tem uma instancia do tratador de evento. Quando
o usuário preenche os campos e clica em acessar, o cliente chama o método classificar
que se encontra no servidor, levando como parâmetro o vetor dos tempos capturados,
nome de usuário e senha.
4.1.2 APPLET CLIENTE DE TREINAMENTO
O applet de treinamento é tela com um campo para o nome de usuário e outros
campos para a digitação repetida da senha. Cada campo de senha tem uma instancia do
tratador de evento. Quando o usuário pressiona o botão Enviar, o cliente chama o
método adicionar padrão que se encontra no servidor, levando como parâmetro os
vetores de tempos capturados, nome do usuário e senha.
44
4.1.3 SERVIDOR
O servidor é parte da aplicação que cuida do controle, da lógica e do modelo do
sistema. O controle é responsável por toda a aplicação servidor, deste a classificação de
um padrão, até a comunicação com o banco de dados. A lógica tem todas as classes e
métodos responsáveis pela classificação.
Já o modelo fica responsável por toda a
estrutura do mapeamento objeto relacional.
O servidor utiliza as tecnologias RMI e Hibernate, o RMI faz a comunicação com os
clientes applets e o Hibernate faz todo o mapeamento objeto relacional com o banco de
dados.
Ao iniciar o servidor, o descritor conceitual ou conjunto de padrões é trazido do
banco de dados para a memória. Assim deixando a aplicação mais leve durante a
execução. Principalmente no lado do cliente. Quando o cliente de treinamento faz uma
requisição, o servidor adiciona o novo padrão no descritor conceitual que está na
memória e também adiciona o novo padrão no banco de dados. Já no momento que um
cliente de acesso faz uma requisição, o servidor chama o método de classificação
utilizando o descritor conceitual que está na memória.
Para o servidor ser executado é necessário que uma aplicação chamada rmiregistry
esteja em execução. O rmiregistry é o serviço de nomes do RMI. Ele obtém e passa as
referencias dos objetos remotos. Com isso os clientes conseguem enxergar o servidor.
4.2 AVALIAÇÃO
45
Na avaliação do sistema e dos classificadores, K-nn e centróide, foi efetuado um
teste prático, no qual os usuários se cadastravam no sistema e depois tentavam obter o
acesso. Também foi pedido a eles que fizessem uma tentativa de acesso com o nome de
usuário e senha de um outro usuário cadastrado no sistema.
Para avaliar os algoritmos de classificação foram feitos dois testes, um como uma
entrada de cinco repetições no treinamento e outro com uma entrada de dez repetições
no treinamento.Também foi criado um teste com quinze repetições, mas só para o
sistema com o algoritmo do centróide. No caso do K-nn, para o treinamento com cinco
repetições foi atribuído o valor 5 (cinco) para o k do classificador, ou seja, o classificador
K-nn procurou os cinco padrões mais semelhantes. Já para o treinamento com dez
repetições foi atribuído o valor 10 (dez) para o k.
Para computar a avaliação, nas telas de aceitação e rejeição de acesso, foi
adicionado um formulário, o qual tinha a função de capturar as ocorrências dos erros
(FAR e FRR). Para isso era preciso saber se o usuário que foi rejeitado ou aceito era um
usuário válido ou um intruso tentando ter acesso. Cada usuário que tentava o acesso ao
sistema respondia o questionário do formulário. Se o usuário tentou o acesso como
intruso ele respondia a opção de tentativa como intruso. Para o caso da tentativa ser
como verídico ele respondia a opção de tentativa como verídico. Cada vez que um
usuário válido era rejeitado, um erro de falsa rejeição (FRR) era computado. Quando um
intruso era aceito pelo sistema, um erro de falsa aceitação (FAR) era computado.
Os testes foram feitos com um total de 20 (vinte) usuários e um total de 100 (cem)
tentativas, cada pessoa fez o seu cadastro nos sistemas, um com cinco, outro com dez e
um com quinze repetições da senha durante o treinamento. Depois, cada pessoa tinha
uma tentativa de acessar com o seu próprio usuário e outra tentativa de acessar com os
46
dados de outro usuário, ou seja, como um intruso. Em alguns casos ouve repetição
desse procedimento de acesso.
4.3 RESULTADOS
Com os resultados(FAR e FRR) capturados a partir dos testes foi gerada um
estatística que faz a comparação entre os algoritmos de classificação levando em
consideração as quantidades de repetições durante o treino.
As Tabelas 4 e 5 mostram as variáveis estatísticas e os resultados obtidos em cima
dos testes realizados com cada um dos algoritmos de classificação. A principal
comparação é feita sobre os valores de erros (FAR e FRR) e a quantidade de repetições
durante o treino. Nos outros valores temos a relação entre a quantidade de tentativas
como usuário verídico e como usuário intruso, onde dessas tentativas temos a
quantidade de falsa aceitação e falsa rejeição.
Tabela 4 - Resultados dos testes com o K-nn.
47
Tabela 5 - Resultados dos testes com o Centróide.
Na Figura 12 é mostrado um comparativo entre os erros do tipo FAR e FRR que
ocorreram durantes os testes com cinco e dez repetições utilizando o algoritmo K-nn.
Percebemos que entre os dois testes houve um aumento de 6% no valor do tipo de erro
FAR e um aumento de 4% no tipo de erro FRR. Isso demonstra que o aumento de
repetições durante o treinamento fez com que o sistema aceitasse mais usuários intrusos
e rejeitasse mais usuários verídicos.
Knn
35,00%
30,00%
30,00%
26,00%
25,00%
20,00%
16,00%
FAR
FRR
15,00%
10,00%
10,00%
5,00%
0,00%
5 repetições no treino
10 repetições no treino
Figura 12 – Diferença do erro FAR entre os testes de 5 e 10 repetições com o K-nn.
48
Já na Figura 13 é mostrado um comparativo entre os erros do tipo FAR e FRR que
ocorreram durantes os testes com cinco, dez e quinze repetições utilizando o algoritmo
do Centróide. Percebemos que entre os três testes houve um aumento do erro do FAR e
ao mesmo tempo uma diminuição do erro do tipo FRR. O índice FAR começou com 0%
no teste com cinco repetições, passou para 10% no teste com dez repetições e
aumentou ainda mais, atingindo 18% no teste com quinze repetições. Já o índice de FRR
começou com 30% no teste com cinco repetições, passou para 10% no teste com dez
repetições e atingiu 6% no teste com quinze repetições. Isso demonstra que o aumento
de repetições durante o treinamento fez com que o sistema aceitasse mais usuários
intrusos e rejeitasse menos usuários verídicos.
Centróide
35,00%
30,00%
30,00%
25,00%
18,00%
20,00%
15,00%
10,00%
FRR
10,00%
10,00%
5,00%
FAR
6,00%
0,00%
0,00%
5 repetições no
treino
10 repetições no
treino
15 repetições no
treino
Figura 13 - Diferença do erro FAR entre os testes de 5 e 10 repetições com o Centróide.
49
Na Figura 14 é mostrado um comparativo entre os erros do tipo FAR e FRR que
ocorreram durantes os testes com cinco repetições utilizando os dois algoritmos de
classificação. Percebe-se que o algoritmo do centróide teve um melhor índice do tipo
FAR do que K-nn. Já o índice do tipo FRR ficou pior com o centróide do que com o K-nn.
Isso demonstra que o algoritmo de centróide ficou mais preciso do que o K-nn, sendo que
a taxa de erro FAR diminuiu ao ponto ideal de 0% e ao mesmo tempo a taxa de FRR teve
um leve aumento de 4%.
5 repetições no treino
35,00%
30,00%
30,00%
26,00%
25,00%
20,00%
15,00%
FAR
FRR
10,00%
10,00%
5,00%
0,00%
0,00%
Knn
Centroíde
Figura 14 – Comparação entre os resultados dos classificadores no treino com 5 repetições.
Temos um comparativo entre os algoritmos de classificação que é mostrado na
Figura 15. Nota-se que tanto a taxa de erro FAR quanto a taxa FRR obtiveram um melhor
valor com a utilização do algoritmo do centróide em relação ao algoritmo K-nn. Isso
demonstra que o algoritmo do centróide obteve melhores resultados do que o algoritmo
K-nn quando se utilizou um treino com 10 repetições.
50
10 repetições no treino
35,00%
30,00%
30,00%
25,00%
20,00%
FAR
16,00%
FRR
15,00%
10,00% 10,00%
10,00%
5,00%
0,00%
Knn
Centroíde
Figura 15 - Comparação entre os resultados dos classificadores no treino com 10 repetições.
Durante os testes o sistema protótipo se comportou bem, mas um pouco pesado
durante a inicialização do applet na primeira vez. Já durante o processo de treinamento e
classificação não ouve uma demora considerável.
Como os testes foram feitos na maioria nas próprias máquinas dos usuários, em
alguns casos não se pode fazer o teste, por causa da incompatibilidade com as versões
entre o código compilado e a versão da máquina virtual Java que estava instalada ou
porque não tinha a máquina virtual instalada.
51
4.4 ANÁLISE
Com os resultados dos testes, ou seja, os valores de erros (FAR, FRR). Pôde-se
então começar o trabalho de análise. Tal análise foi feita levando em consideração
algumas questões:
Qual técnica de classificação é melhor técnica?
O que os usuários acharam da nova forma de autenticação?
A autenticação através da dinâmica da digitação teve sucesso?
4.4.1 TÉCNICAS DE CLASSIFICAÇÃO
As técnicas de classificação K-nn e centróide tiveram resultados bastante
diferentes. O classificador K-nn não obteve um desempenho esperado. Sendo que a
intenção de combater o padrão de um usuário com o outro era algo que limitava o
tamanho das senhas. Já o classificador utilizando o centróide obteve bons resultados.
Como também trouxe a vantagem de não limitar o tamanho da senha.
Com os resultados do K-nn, Pode-se observar que os testes com o sistema que
tinha um treinamento com cinco repetições obtiveram uma taxa menor de erro aos testes
que tinham treinamento com dez repetições. Isso pode ter ocorrido pelo fato de o valor do
K, no caso do treinamento com dez repetições, ser dez, com isso, abranger uma maior
área de vizinhança, assim podendo obter uma maior dissimilaridade entre os dez vizinhos
encontrados.
52
O algoritmo do centróide poderia ser utilizado em produção, sendo que um sistema
com cinco repetições durante o treino teria um alto nível de segurança. Pois não aceitaria
intruso. Mas teria uma grande taxa de rejeição de usuários verídicos.
Outra técnica poderia ser utilizada com o intuito de melhorar a calcificação do
usuário. Esse classificador poderia ser implementado com a característica de verificar
uma pequena mudança do padrão do usuário e aprender esse padrão.
4.4.2 OPINIÃO DOS USUÁRIOS
Alguns usuários ficaram incomodados durante o treinamento, pode-se notar que
durante o treinamento com cinco repetições não ouve tanta reclamação, mas durante o
treinamento com dez repetições ouve uma maior reclamação. Os usuários acharam um
pouco maçante repetir várias vezes à mesma coisa, ou seja, a senha.
Outros usuários tentaram testar o sistema digitando a senha de um modo no
treinamento e de outro modo no acesso, claro que nesses casos o sistema não aceitou.
Percebi que os usuários que não sabiam que era pelo tempo da digitação que o sistema
capturava o padrão, se saíram melhor durante os treinamentos e obtiveram uma melhor
aceitação pelo sistema, não ocorria erro de falsa rejeição(FRR).
Para diminuir a irritação do usuário utilizadores do sistema, a forma de treinamento
poderia ser melhorada. Sendo que, o cadastro do usuário ao sistema seria um cadastro
normal, onde o usuário repete a senha duas vezes. Entretanto, nas primeiras vezes que o
usuário fosse obter acesso ao sistema, automaticamente o ritmo de digitação do usuário
seria capturado, com isso, obtendo o conjunto de treino.
53
5 CONCLUSÃO
O estudo da dinâmica da digitação e outras técnicas biométricas mostram que a
técnica da dinâmica da digitação é uma técnica de custo baixo, mas que garante uma
elevação significativa nos níveis de segurança dos sistemas. Isso é fundamental para
sistemas que estão na Web. A cada dia mais sistemas estão sendo criados na Internet e
o sistema protótipo criado neste trabalho pode perfeitamente ser utilizado em produção,
pois a sua arquitetura garante um bom funcionamento.
Os resultados obtidos com a utilização do classificador K-nn não foram satisfatórios.
Já o classificador utilizando o centróide teve um resultado bom comparado com o K-nn e
trabalhos relacionados.
O sistema protótipo criado pode muito bem ser utilizado em produção, pois a sua
arquitetura garante um bom funcionamento.
Para trabalhos futuros é importante o desenvolvimento de um classificador que
venha a melhorar o processo de classificação. Esse classificador poderia ser
implementado com a característica de verificar uma pequena mudança temporal do
padrão do usuário e aprender essa mudança. Pode-se também, melhorar a etapa de
treinamento, sendo que, no lugar de treinar o usuário no cadastro, o treino seria realizado
durantes os primeiros acessos do usuário ao sistema.
Um classificador utilizando a distancia de Mahalanobis poderia ser implementado. O
algoritmo baseado Mahalanobis descreve melhor o espaço composto pelos padrões.
Sendo que, em vez de formar uma circunferência para descrever o comportamento dos
padrões, Mahalanobis formaria uma elipse.
54
REFERÊNCIAS
OBAIDAT, M. S.; SADOUN, B.; BOLLE, Ruud M.; PANKANTI, Sharath. Keystroke
dynamics based authentication. Biometrics: Personal Identification in Networked
Society. Springer, 1999. p. 213-231.
FAUNDEZ Z., M. Biometric security technology. Aerospace and Electronic Systems
Magazine, IEEE, v. 21, n. 6, p. 15-26, jun. 2006.
PHILLIPS, P.J.; MARTIN, A.; WILSON, C.L.; PRZYBOCKI, M. An introduction
evaluating biometric systems. Computer, IEEE, v. 33, n. 2, p. 56-63, feb. 2000.
MAGALHÃES, S. T.; REVETT, KENNETH; SANTOS, HENRIQUE M. D. Password
Secured Sites – Stepping Forward With Keystroke Dynamics. Proceedings of the
International Conference on Next Generation Web Services Practices, 2005.
ILONEN,
Jarmo.
Keystroke
Dynamics.
Disponível
em
<http://www.caslon.com.au/biometricsnote6.htm#keystroke.htm>. Acessado em 22 oct.
2006.
REVETT, K. and KHAN, A., 2005, Enhancing login compatible with those produced by
very expensive security using keystroke hardening and keyboard gridding, Proceedings
of the IADIS MCCSIS 2005.
CAVALCANTI, GEORGE D. C.; PINHEIRO, EGGO H. F.; CARVALHO, EDSON C. B. Um
sistema de verificação de identidade pessoal através de dinâmica da digitação. XXV
Congresso da Sociedade Brasileira de Computação, jul. 2005.
HAIDER, S.; ABBAS, A.; ZAIDI, A.K. A multi-technique approach for user identification
through keystroke dynamics. Systems, Man, and Cybernetics, 2000 IEEE International
Conference on, v. 2, p.1336-1341, oct. 2000.
CHO, SUNGZOON et al. Web based Keystroke Dynamics Identity Verification using
Neural Network. Journal of Organizational Computing and Electronic Commerce, v.
10, n. 4, p. 295-307, dec. 2000.
CURTIN MARY et al. Keystroke Biometric Recognition on Long-Text Input: A
Feasibility Study. International MultiConference of Engineers and Computer Scientists,
jun. 2006.
LAU, EDMOND et al. Enhanced User Authentication Through Keystroke Biometrics.
Massachusetts Institute of Technology, 09 dec. 2004.
55
JAIN; ANIL, DUIN; ROBERT, MAO; JIANCHANG. Statistical Pattern Recognition: A
Review. IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE
INTELLIGENCE, Michigan, v.22, n.1, p.4-34, jan.2000.
RANDALL; WILSON, MARTINEZ; TONY. Reduction Techniques for Instance-Based
Learning Algorithms. Machine Learning, Utah, v.38, p.257-286, 2000.
McCarthy, John. What Is Artificial Intelligence?. Disponível em < [21]
http://wwwformal.stanford.edu/jmc/whatisai/whatisai.html >. Acessado em: 15 jan. 2007
MacQueen, J. B. Some Methods for classification and Analysis of Multivariate
Observations, Proceedings of 5-th Berkeley Symposium on Mathematical Statistics and
Probability, Berkeley, University of California Press, 1:281-297. 1967
56
ANEXO A – CÓDIGO FONTE DA APLICAÇÃO
Servidor.java
package rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;
public interface Servidor extends Remote{
public void adicionaPadrao(List<Double> tempos) throws RemoteException;
public boolean classifica(List<Double> tempos) throws RemoteException;
public boolean usuarioExitente(String nome, String senha) throws RemoteException;
public void fechaSessaoComHibernate() throws RemoteException;
public void salvaUsuario() throws RemoteException;
public void criaCircunferencia() throws RemoteException;
public void atribuiNomeESenha(String nome, String senha) throws RemoteException;
}
AppletDeAcesso.java
package cliente.gui;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import cliente.observador.Observador;
import rmi.Servidor;
57
public class AppletDeAcesso extends JApplet implements ActionListener, Observador{
/**
*
*/
private static final long serialVersionUID = 1L;
private JLabel nomeLabel, senhaLabel, resultadoLabel;
private JTextField nomeField,senhaField, resultadoField;
private JButton fazAcesso;
private Container container;
private EventoDaSenha eventoDaSenha;
private Servidor servidor;
public void init(){
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
criaGUI();
}
});
} catch (Exception e) {
e.printStackTrace();
System.err.println("Não foi possível criar a GUI");
}
System.out.println("iniciando... ");
}
private void criaGUI() {
try{
Registry registry = LocateRegistry.getRegistry("150.162.67.73",1500);
servidor = (Servidor) registry.lookup ("Servidor5");
System.out.println("Objeto controle instanciado");
}catch(RemoteException Re){
System.out.println(Re.getMessage());
}catch(NotBoundException NBe){
System.out.println(NBe.getMessage());
}
container = getContentPane();
container.setLayout( new FlowLayout());
nomeLabel = new JLabel( "Nome de usuário: ");
container.add(nomeLabel);
nomeField = new JTextField(10);
container.add(nomeField);
nomeField.addActionListener(this);
senhaLabel = new JLabel("senha: ");
container.add(senhaLabel);
58
senhaField = new JTextField(10);
container.add(senhaField);
eventoDaSenha = new EventoDaSenha(this);
senhaField.addKeyListener(eventoDaSenha);
fazAcesso = new JButton("Acessar");
fazAcesso.addActionListener(this);
container.add(fazAcesso);
}
public void start() {
System.out.println("começando... ");
}
public void stop() {
System.out.println("parando... ");
}
public void destroy() {
System.out.println("destroindo... ");
}
public void actionPerformed(ActionEvent e) {
if(nomeField.getText().length() == 0){
System.out.println("O campo nome deve ser preenchido.");
}
if(confereCampos()){
String nome = nomeField.getText();
String senha = senhaField.getText();
int estado = 0;
try {
if(servidor.usuarioExitente(nome, senha)){
if(!servidor.classifica(eventoDaSenha.getTemposDaDigitacao())){
estado = 2;
}
}else{
estado = 1;
}
System.out.println("classifica: "+estado);
servidor.fechaSessaoComHibernate();
mudarDePagina(estado);
} catch (RemoteException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
private boolean confereCampos() {
boolean retorno = true;
59
String mensagem="";
if((nomeField.getText().trim().length() < 1)){
mensagem = "\n-O campo nome deve ser preenchido.";
nomeField.requestFocus();
retorno = false;
}
if((senhaField.getText().trim().length() < 1)){
mensagem +="\n"+ "-O campo senha deve ser preenchido.";
if(retorno != false){
senhaField.requestFocus();
}
retorno = false;
}
if(!retorno){
JOptionPane.showMessageDialog(null,"ERRO: "+ mensagem,"ERRO",
JOptionPane.INFORMATION_MESSAGE );
}
return retorno;
}
private void mudarDePagina(int estado) {
String pagina="";
URL url;
switch (estado) {
case 0:
pagina =
"aceito.php?pagina=aceito&nomeDeUsuario="+nomeField.getText()+"&senha="+senhaField.getText();
break;
case 1:
pagina =
"usuarioInexistente.html?nomeDeUsuario="+nomeField.getText()+"&senha="+senhaField.getText();
break;
case 2:
pagina =
"rejeitado.php?pagina=rejeitado&nomeDeUsuario="+nomeField.getText()+"&senha="+senhaField.getText();
break;
default:
break;
}
try {
String documentString = getDocumentBase().toString();
if (documentString.endsWith("/")) {
url = new URL(getDocumentBase()+pagina);
getAppletContext().showDocument(url, "_top");
}
else {
url = new URL(getDocumentBase()+"/../"+pagina);
60
getAppletContext().showDocument(url, "_top");
}
}catch (Exception e) {
e.printStackTrace();
}
}
public void atualize(String mensagem) {
if(senhaField.hasFocus()){
JOptionPane.showMessageDialog(null,"ERRO: "+mensagem+"\n Por Favor redigite a
senha.","ERRO", JOptionPane.INFORMATION_MESSAGE );
senhaField.setText("");
senhaField.requestFocus();
eventoDaSenha = new EventoDaSenha(this);
senhaField.addKeyListener(eventoDaSenha);
}
}
}
AppletDeTreinamento.java
package cliente.gui;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import rmi.Servidor;
import cliente.observador.Observador;
public class AppletDeTreinamento extends JApplet implements ActionListener, Observador{
/**
*
*/
private static final long serialVersionUID = 1L;
private static final int QUANTIDADE_DE_SENHAS = 5;
private JLabel nomeLabel, senhaLabel, resultadoLabel;
61
private JTextField nomeField;
private List<JTextField> listaDeTextField;
private JButton fazAcesso;
private Container container;
private List<EventoDaSenha> listaDeEventoDaSenha;
private Servidor servidor;
public void init(){
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
criaGUI();
}
});
} catch (Exception e) {
System.err.println("Não foi possível criar a GUI");
e.printStackTrace();
}
System.out.println("iniciando... ");
}
private void criaGUI() {
try{
Registry registry = LocateRegistry.getRegistry("150.162.67.73",1500);
servidor = (Servidor) registry.lookup ("Servidor5");
System.out.println("Objeto controle instanciado");
}catch(RemoteException Re){
System.out.println(Re.getMessage());
}catch(NotBoundException NBe){
System.out.println(NBe.getMessage());
}
listaDeTextField = new LinkedList<JTextField>();
listaDeEventoDaSenha = new LinkedList<EventoDaSenha>();
container = getContentPane();
container.setLayout( new FlowLayout());
nomeLabel = new JLabel( "Nome de usuário: ");
container.add(nomeLabel);
nomeField = new JTextField(10);
container.add(nomeField);
nomeField.addActionListener(this);
senhaLabel = new JLabel("senha repetida: ");
container.add(senhaLabel);
for(int i=0; i < QUANTIDADE_DE_SENHAS; i++){
62
JTextField textField = new JTextField(10);
listaDeTextField.add(i, textField);
container.add(textField);
EventoDaSenha eventoDaSenha = new EventoDaSenha(this);
listaDeEventoDaSenha.add(i,eventoDaSenha);
textField.addKeyListener(eventoDaSenha);
}
fazAcesso = new JButton(" Enviar ");
fazAcesso.addActionListener(this);
container.add(fazAcesso);
}
public void start() {
System.out.println("começando... ");
}
public void stop() {
System.out.println("parando... ");
}
public void destroy() {
System.out.println("destruindo... ");
}
public void actionPerformed(ActionEvent e) {
if(confereCampos()){
String nome = nomeField.getText();
String senha = listaDeTextField.get(0).getText();
try {
servidor.atribuiNomeESenha(nome, senha);
for(EventoDaSenha eventoDaSenha : listaDeEventoDaSenha){
System.out.println("SAsadsa:
"+eventoDaSenha.getTemposDaDigitacao());
servidor.adicionaPadrao(eventoDaSenha.getTemposDaDigitacao());
}
servidor.criaCircunferencia();
servidor.salvaUsuario();
mudarDePagina("treinado.html");
} catch (RemoteException e1) {
mudarDePagina("erro.html");
e1.printStackTrace();
}
}
}
63
private boolean confereCampos() {
boolean retorno = true;
String mensagem="";
boolean erro = false;
if((nomeField.getText().trim().length() < 1)){
mensagem = "\n-O campo nome deve ser preenchido.";
nomeField.requestFocus();
retorno = false;
}
if(listaDeTextField.get(0).getText().trim().length() >= 1){
for(JTextField jTextField : listaDeTextField){
if(jTextField.getText().trim().length() < 1 ||
!listaDeTextField.get(0).getText().equals(jTextField.getText())){
erro = true;
}
}
}else{
erro = true;
}
if(erro){
mensagem +="\n"+"-Os 5 campos não comtem a mesma senha, por favor digite
novamente";
if(retorno != false){
listaDeTextField.get(0).requestFocus();
}
retorno = false;
limpaCamposDaSenha();
}
if(!retorno){
JOptionPane.showMessageDialog(null,"ERRO: "+ mensagem,"ERRO",
JOptionPane.INFORMATION_MESSAGE );
}
return retorno;
}
private void limpaCamposDaSenha() {
for(int i=0;i < QUANTIDADE_DE_SENHAS; i++){
listaDeTextField.get(i).setText("");
EventoDaSenha eventoDaSenha = new EventoDaSenha(this);
listaDeEventoDaSenha.set(i,eventoDaSenha);
listaDeTextField.get(i).addKeyListener(eventoDaSenha);
64
}
}
private void mudarDePagina(String pagina) {
URL url;
try {
String documentString = getDocumentBase().toString();
if (documentString.endsWith("/")) {
url = new URL(getDocumentBase()+pagina);
getAppletContext().showDocument(url, "_top");
}
else {
url = new URL(getDocumentBase()+"/../"+pagina);
getAppletContext().showDocument(url, "_top");
}
}catch (Exception e) {
e.printStackTrace();
}
}
public void atualize(String mensagem) {
for(int i=0;i < QUANTIDADE_DE_SENHAS; i++){
if(listaDeTextField.get(i).hasFocus()){
JOptionPane.showMessageDialog(null,"ERRO: "+mensagem+"\n Por Favor
redigite a senha.","ERRO", JOptionPane.INFORMATION_MESSAGE );
EventoDaSenha eventoDaSenha = new EventoDaSenha(this);
listaDeEventoDaSenha.set(i,eventoDaSenha);
listaDeTextField.get(i).addKeyListener(eventoDaSenha);
listaDeTextField.get(i).setText("");
//listaDeTextField.get(i).requestFocus();
}
}
}
}
EventoDaSenha.java
package cliente.gui;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;
import java.util.List;
import cliente.observador.Observador;
65
public class EventoDaSenha implements KeyListener {
private double tempoQuandoPressionar;
private double tempoQuandoSoltar;
private double tempoTemporario;
private List<Double> temposDaDigitacao;
private TratadorDeEventoPressionado tratadorDeEventoPressionado;
private TratadorDeEventoSolto tratadorDeEventoSolto;
public EventoDaSenha(Observador observador){
this.temposDaDigitacao = new LinkedList<Double>();
tratadorDeEventoPressionado = new TratadorDeEventoPressionado(this);
tratadorDeEventoPressionado.adicionarObservador(observador);
tratadorDeEventoSolto = new TratadorDeEventoSolto(this);
tratadorDeEventoSolto.adicionarObservador(observador);
}
public EventoDaSenha(List<Double> temposDaDigitacao, Observador observador){
this.temposDaDigitacao = temposDaDigitacao;
tratadorDeEventoPressionado = new TratadorDeEventoPressionado(this);
tratadorDeEventoPressionado.adicionarObservador(observador);
tratadorDeEventoSolto = new TratadorDeEventoSolto(this);
tratadorDeEventoSolto.adicionarObservador(observador);
}
public List<Double> getTemposDaDigitacao() {
return temposDaDigitacao;
}
public double getTempoQuandoPressionar() {
return tempoQuandoPressionar;
}
public void setTempoQuandoPressionar(double tempoQuandoPrecionar) {
this.tempoQuandoPressionar = tempoQuandoPrecionar;
}
public double getTempoQuandoSoltar() {
return tempoQuandoSoltar;
}
public void setTempoQuandoSoltar(double tempoQuandoSoltar) {
this.tempoQuandoSoltar = tempoQuandoSoltar;
}
public double getTempoTemporario() {
return tempoTemporario;
}
public void setTempoTemporario(double tempoTemporario) {
this.tempoTemporario = tempoTemporario;
}
public void setTemposDaDigitacao(List<Double> temposDaDigitacao) {
66
this.temposDaDigitacao = temposDaDigitacao;
}
public void keyPressed(KeyEvent key){
tratadorDeEventoPressionado.trataEvento(key);
//tempoQuandoPrecionar = System.nanoTime();
}
public void keyReleased(KeyEvent key) {
/*tempoQuandoSoltar = System.nanoTime();
double tempoEntrePrecionarESoltar = tempoQuandoSoltar - tempoQuandoPrecionar;
System.out.println("Tempo de precionar e soltar: "+tempoEntrePrecionarESoltar);
temposDaDigitacao.add(tempoEntrePrecionarESoltar);*/
tratadorDeEventoSolto.trataEvento(key);
}
public void keyTyped(KeyEvent key) {
}
}
TratadorDeEvento.java
package cliente.gui;
import java.awt.event.KeyEvent;
import cliente.observador.Observador;
import cliente.observador.Observavel;
public abstract class TratadorDeEvento implements Observavel{
protected EventoDaSenha eventoDaSenha;
protected Observador observador;
public TratadorDeEvento(EventoDaSenha eventoDaSenha) {
this.eventoDaSenha = eventoDaSenha;
}
public void trataEvento(KeyEvent evento){
switch (evento.getKeyCode()) {
case KeyEvent.VK_BACK_SPACE:
trataBackSpace();
break;
67
case KeyEvent.VK_ENTER:
trataEnter();
break;
case KeyEvent.KEY_LOCATION_STANDARD:
trataBackSpace();
break;
default:
trataOResto(evento);
break;
}
}
private void trataOResto(KeyEvent evento) {
char c = evento.getKeyChar();
if(Character.isLetterOrDigit(c)){
calculaOsTempos();
}
}
protected abstract void calculaOsTempos();
protected abstract void trataEnter();
protected abstract void trataBackSpace();
}
TratadorDeEventoPressionado.java
package cliente.gui;
import cliente.observador.Observador;
public class TratadorDeEventoPressionado extends TratadorDeEvento{
public TratadorDeEventoPressionado(EventoDaSenha eventoDaSenha) {
super(eventoDaSenha);
}
@Override
protected void calculaOsTempos() {
double tempoEntreUmaTeclaEOutra;
eventoDaSenha.setTempoTemporario(eventoDaSenha.getTempoQuandoPressionar());
eventoDaSenha.setTempoQuandoPressionar(System.nanoTime());
System.out.println(eventoDaSenha.getTempoQuandoPressionar());
if(eventoDaSenha.getTempoTemporario() != 0){
tempoEntreUmaTeclaEOutra = eventoDaSenha.getTempoQuandoPressionar() eventoDaSenha.getTempoTemporario();
68
eventoDaSenha.getTemposDaDigitacao().add(tempoEntreUmaTeclaEOutra);
}
}
@Override
protected void trataBackSpace() {
notificaObservadores("tecla backspace pressionada");
}
@Override
protected void trataEnter() {
notificaObservadores("tecla enter pressionada");
}
public void adicionarObservador(Observador observador) {
super.observador = observador;
}
public void notificaObservadores(String mensagem) {
super.observador.atualize(mensagem);
}
}
TratadorDeEventoSolto.java
package cliente.gui;
import cliente.observador.Observador;
public class TratadorDeEventoSolto extends TratadorDeEvento{
public TratadorDeEventoSolto(EventoDaSenha eventoDaSenha) {
super(eventoDaSenha);
}
@Override
protected void calculaOsTempos() {
eventoDaSenha.setTempoQuandoSoltar(System.nanoTime());
System.out.println(eventoDaSenha.getTempoQuandoSoltar());
double tempoEntrePrecionarESoltar = eventoDaSenha.getTempoQuandoSoltar() eventoDaSenha.getTempoQuandoPressionar();
System.out.println(tempoEntrePrecionarESoltar);
eventoDaSenha.getTemposDaDigitacao().add(tempoEntrePrecionarESoltar);
}
@Override
protected void trataBackSpace() {
//notificaObservadores("tecla backspace pressionada");
}
@Override
protected void trataEnter() {
//notificaObservadores("tecla enter pressionada");
69
}
public void adicionarObservador(Observador observador) {
super.observador = observador;
}
public void notificaObservadores(String mensagem) {
super.observador.atualize(mensagem);
}
}
Observador.java
package cliente.observador;
public interface Observador {
public void atualize(String mensagem);
}
Observável.java
package cliente.observador;
public interface Observavel {
public void adicionarObservador(Observador observador);
public void notificaObservadores(String mensagem);
}
Controle.java
package servidor.controle;
import java.io.Serializable;
import java.util.List;
import servidor.logica.Usuario;
import servidor.logica.classificacao.PertencenteACircunferencia;
import servidor.logica.metricas.Distancia;
import servidor.logica.metricas.DistanciaEuclidiana;
import servidor.logica.padrao.Padrao;
import servidor.modelo.Dao;
import servidor.modelo.DaoFactory;
public class Controle implements Serializable{
70
private Distancia distancia;
private Usuario usuario;
private PertencenteACircunferencia pertencenteACircunferencia;
private DaoFactory daoFactory;
public Controle(){
this.usuario = new Usuario();
this.distancia = new DistanciaEuclidiana();
this.pertencenteACircunferencia = new
PertencenteACircunferencia(distancia,usuario.getCircunferencia());
}
public void adicionaPadrao(List<Double> tempos){
Padrao padrao = new Padrao(tempos);
usuario.getCircunferencia().getPadroes().add(padrao);
}
public boolean classifica(List<Double> tempos){
Padrao padraoASerClassificado = new Padrao(tempos);
return pertencenteACircunferencia.classifica(padraoASerClassificado);
}
public void atribuiNomeESenha(String nome, String senha){
this.usuario = new Usuario();
this.distancia = new DistanciaEuclidiana();
this.pertencenteACircunferencia = new
PertencenteACircunferencia(distancia,usuario.getCircunferencia());
usuario.setNome(nome);
usuario.setSenha(senha);
}
public void criaCircunferencia(){
usuario.getCircunferencia().calculaCentroide();
usuario.getCircunferencia().calculaRaio(distancia);
}
public void salvaUsuario(){
try {
if(daoFactory == null){
this.daoFactory = new DaoFactory();
}
Dao<Usuario> usuarioDAO = daoFactory.getUsuarioDao();
usuarioDAO.adiciona(usuario);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void selecionaUsuario(String nome, String senha){
try {
if(daoFactory == null){
71
this.daoFactory = new DaoFactory();
}
Dao<Usuario> usuarioDAO = daoFactory.getUsuarioDao();
this.usuario = usuarioDAO.procura(nome, senha);
if(usuario != null){
this.pertencenteACircunferencia = new
PertencenteACircunferencia(distancia,usuario.getCircunferencia());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean usuarioExitente(String nome, String senha){
boolean condicao = false;
this.selecionaUsuario(nome, senha);
if(this.usuario != null){
condicao = true;
}
System.out.println("usuário exixtente: "+condicao);
return condicao;
}
public void fechaSessaoComHibernate(){
if(daoFactory.hasTransaction()){
daoFactory.close();
}
}
}
NearestNeighbour.java
package servidor.logica.classificacao;
import java.util.List;
import servidor.logica.metricas.Distancia;
import servidor.logica.padrao.Classe;
import servidor.logica.padrao.Padrao;
public class NearestNeighbour implements Classificacao{
private List<Padrao> conjuntoDePadroes;
private Padrao padraoASerClassificado;
private Distancia metrica;
private double melhorDistancia;
public NearestNeighbour(Distancia metrica,List<Padrao> conjuntoDePadroes){
this.conjuntoDePadroes = conjuntoDePadroes;
this.metrica = metrica;
72
}
public void classifica(){
Padrao padraoMaisPerto = new Padrao();
double distanciaMelhor = java.lang.Double.MAX_VALUE;
double distanciaProx = 0;
metrica.setPadrao2(padraoASerClassificado);
for(Padrao p : conjuntoDePadroes){
metrica.setPadrao1(p);
distanciaProx = metrica.calcula();
if(distanciaProx < distanciaMelhor){
padraoMaisPerto = p;
distanciaMelhor = distanciaProx;
}
}
Classe classe = padraoMaisPerto.getClasse();
padraoASerClassificado.setClasse(classe);
setMelhorDistancia(distanciaMelhor);
}
public List<Padrao> getConjuntoDePadroes() {
return conjuntoDePadroes;
}
public void setConjuntoDePadroes(List<Padrao> conjuntoDePadroes) {
this.conjuntoDePadroes = conjuntoDePadroes;
}
public Padrao getPadraoASerClassificado() {
return padraoASerClassificado;
}
public void setPadraoASerClassificado(Padrao pontoASerClassificado) {
this.padraoASerClassificado = pontoASerClassificado;
}
public Distancia getMetrica() {
return metrica;
}
public void setMetrica(Distancia metrica) {
this.metrica = metrica;
73
}
public void adicionarPadraoAoConjunto(Padrao p){
conjuntoDePadroes.add(p);
}
public double getMelhorDistancia() {
return melhorDistancia;
}
public void setMelhorDistancia(double melhorDistancia) {
this.melhorDistancia = melhorDistancia;
}
}
KnearestNeighbour.java
package servidor.logica.classificacao;
import java.io.Serializable;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import servidor.logica.metricas.Distancia;
import servidor.logica.padrao.Classe;
import servidor.logica.padrao.Padrao;
public class KnearestNeighbour implements Classificacao, Serializable {
private List<Padrao> conjuntoDePadroes;
private Padrao padraoASerClassificado;
private Distancia metrica;
private int k;
public KnearestNeighbour(Distancia metrica,List<Padrao> conjuntoDePontos, int k){
this.conjuntoDePadroes = conjuntoDePontos;
this.metrica = metrica;
this.k = k;
}
private List<AssociacaoPadraoDistancia> geraListaDosMaisProximos(){
List<AssociacaoPadraoDistancia> listaDePadroesMaisProximos = new
LinkedList<AssociacaoPadraoDistancia>();
int tamanhoDaLista = k;
boolean adicionado;
double distanciaDoP = 0;
int i = 0;
74
metrica.setPadrao2(padraoASerClassificado);
for(Padrao p : conjuntoDePadroes){
metrica.setPadrao1(p);
distanciaDoP = metrica.calcula();
if(listaDePadroesMaisProximos.isEmpty()){
AssociacaoPadraoDistancia a = new
AssociacaoPadraoDistancia(p,distanciaDoP);
listaDePadroesMaisProximos.add(a);
}else{
i=0;
adicionado = false;
while(i < listaDePadroesMaisProximos.size()){
if(distanciaDoP <
listaDePadroesMaisProximos.get(i).getDistancia() && (listaDePadroesMaisProximos.size() <= tamanhoDaLista)){
AssociacaoPadraoDistancia a = new
AssociacaoPadraoDistancia(p,distanciaDoP);
listaDePadroesMaisProximos.add(i,a);
i=tamanhoDaLista;
adicionado = true;
}
i++;
}
if(listaDePadroesMaisProximos.size() <= tamanhoDaLista){
if(!adicionado){
AssociacaoPadraoDistancia a = new
AssociacaoPadraoDistancia(p,distanciaDoP);
listaDePadroesMaisProximos.add(a);
}
}
if(listaDePadroesMaisProximos.size() > tamanhoDaLista)
listaDePadroesMaisProximos.remove(tamanhoDaLista);
}
}
return listaDePadroesMaisProximos;
}
public void classifica(){
classifica(geraListaDosMaisProximos());
}
private void classifica(List<AssociacaoPadraoDistancia> listaDePadraosMaisProximos) {
HashMap<Classe,Integer> hash = new HashMap<Classe,Integer>();
Classe classeDeMaiorOcorrencia = null;
75
int aux = 0;
for(AssociacaoPadraoDistancia associacao : listaDePadraosMaisProximos){
if (hash.containsKey(associacao.getPadrao().getClasse())){
int incremento = hash.get(associacao.getPadrao().getClasse());
incremento++;
hash.put(associacao.getPadrao().getClasse(),incremento);
} else {
hash.put(associacao.getPadrao().getClasse(),1);
}
}
Set<Classe> set = hash.keySet();
for (Classe c : set){
if (hash.get(c) > aux){
aux = hash.get(c);
classeDeMaiorOcorrencia = c;
}
}
padraoASerClassificado.setClasse(classeDeMaiorOcorrencia);
}
public List<Padrao> getConjuntoDePadroes() {
return conjuntoDePadroes;
}
public void setConjuntoDePadroes(List<Padrao> conjuntoDePadraos) {
this.conjuntoDePadroes = conjuntoDePadraos;
}
public int getK() {
return k;
}
public void setK(int k) {
this.k = k;
}
public Distancia getMetrica() {
return metrica;
}
public void setMetrica(Distancia metrica) {
this.metrica = metrica;
}
public Padrao getPadraoASerClassificado() {
return padraoASerClassificado;
}
public void setPadraoASerClassificado(Padrao padraoASerClassificado) {
this.padraoASerClassificado = padraoASerClassificado;
}
76
public void adicionarPadraoAoConjunto(Padrao p){
conjuntoDePadroes.add(p);
}
}
Classificacao.java
package servidor.logica.classificacao;
import java.util.List;
import servidor.logica.metricas.Distancia;
import servidor.logica.padrao.Padrao;
public interface Classificacao {
public void classifica();
public List<Padrao> getConjuntoDePadroes();
public void setConjuntoDePadroes(List<Padrao> conjuntoDePadroes);
public Padrao getPadraoASerClassificado();
public void setPadraoASerClassificado(Padrao pontoASerClassificado);
public Distancia getMetrica();
public void setMetrica(Distancia metrica);
public void adicionarPadraoAoConjunto(Padrao p);
}
AssociacaoPadraoDistancia.java
package servidor.logica.classificacao;
import servidor.logica.padrao.Padrao;
public class AssociacaoPadraoDistancia {
private Padrao padrao;
private double distancia;
public AssociacaoPadraoDistancia(Padrao padrao,double distancia){
this.padrao = padrao;
this.distancia = distancia;
}
public Padrao getPadrao() {
return padrao;
77
}
public void setPadrao(Padrao padrao) {
this.padrao = padrao;
}
public double getDistancia() {
return distancia;
}
public void setDistancia(double distancia) {
this.distancia = distancia;
}
}
Circunferencia.java
package servidor.logica.agrupamento;
import java.util.LinkedList;
import java.util.List;
import servidor.logica.metricas.Distancia;
import servidor.logica.padrao.Padrao;
public class Circunferencia {
private List<Padrao> padroes;
private Padrao centroide;
private double raio;
public Circunferencia(){
this.padroes = new LinkedList<Padrao>();
centroide = new Padrao();
}
public Circunferencia(List<Padrao> padroes){
this.padroes = padroes;
centroide = new Padrao();
}
public Padrao getCentroide() {
return centroide;
}
public void setCentroide(Padrao centroide) {
this.centroide = centroide;
}
public List<Padrao> getPadroes() {
return padroes;
}
public void setPadroes(List<Padrao> padroes) {
this.padroes = padroes;
78
}
public double getRaio() {
return raio;
}
public void setRaio(double raio) {
this.raio = raio;
}
public void calculaCentroide(){
for(int i =0; i< padroes.get(0).getValoresDoPadrao().size(); i++){
centroide.getValoresDoPadrao().add(i, null);
for(Padrao padrao : padroes){
if(centroide.getValoresDoPadrao().get(i) == null){
centroide.getValoresDoPadrao().set(i,padrao.getValoresDoPadrao().get(i));
}else{
centroide.getValoresDoPadrao().set(i,
centroide.getValoresDoPadrao().get(i) + padrao.getValoresDoPadrao().get(i));
}
}
centroide.getValoresDoPadrao().set(i,
centroide.getValoresDoPadrao().get(i)/padroes.size());
}
}
public void calculaRaio(Distancia distancia){
double distanciaMaior = java.lang.Double.MIN_VALUE;
double distanciaAux =0d;
distancia.setPadrao1(centroide);
for(Padrao padrao : padroes){
distancia.setPadrao2(padrao);
distanciaAux = distancia.calcula();
if(distanciaMaior < distanciaAux){
distanciaMaior = distanciaAux;
}
}
this.raio = distanciaMaior;
}
}
PertencenteACircunferencia.java
package servidor.logica.classificacao;
import servidor.logica.agrupamento.Circunferencia;
import servidor.logica.metricas.Distancia;
79
import servidor.logica.padrao.Padrao;
public class PertencenteACircunferencia{
private Distancia metrica;
private Circunferencia circunferencia;
public PertencenteACircunferencia(Distancia metrica){
this.metrica = metrica;
}
public PertencenteACircunferencia(Distancia metrica, Circunferencia circunferencia){
this.metrica = metrica;
this.circunferencia = circunferencia;
}
public boolean classifica(Padrao padraoASerClassificado){
boolean retorno = false;
double distancia = 0d;
metrica.setPadrao1(circunferencia.getCentroide());
metrica.setPadrao2(padraoASerClassificado);
distancia = metrica.calcula();
double novoRaio = circunferencia.getRaio();
System.out.println("distancia: "+distancia);
System.out.println("raio: "+circunferencia.getRaio());
System.out.println("novo raio: "+novoRaio);
if(distancia <= novoRaio){
retorno = true; //aceito
}else{
retorno = false; //rejeitado
}
return retorno;
}
public Distancia getDistancia() {
return metrica;
}
public void setDistancia(Distancia distancia) {
this.metrica = distancia;
}
}
Distancia.java
package servidor.logica.metricas;
import servidor.logica.padrao.Padrao;
public interface Distancia {
80
public double calcula();
public Padrao getPadrao1();
public void setPadrao1(Padrao padrao1);
public Padrao getPadrao2();
public void setPadrao2(Padrao adrao2);
}
DistanciaEuclidiana.java
package servidor.logica.metricas;
import java.io.Serializable;
import java.util.List;
import servidor.logica.padrao.Padrao;
public class DistanciaEuclidiana implements Distancia, Serializable {
private Padrao padrao1;
private Padrao padrao2;
public DistanciaEuclidiana(Padrao padrao1, Padrao padrao2){
this.padrao1 = padrao1;
this.padrao2 = padrao2;
}
public DistanciaEuclidiana() {
}
public double calcula() {
double resultado = 0;
double valorParcial;
List<Double> valoresDoPadrao1 = padrao1.getValoresDoPadrao();
List<Double> valoresDoPadrao2 = padrao2.getValoresDoPadrao();
for(int i = 0;i < valoresDoPadrao1.size();i++){
valorParcial = Math.pow((valoresDoPadrao1.get(i) - valoresDoPadrao2.get(i)),2);
81
resultado += valorParcial;
}
return Math.sqrt(resultado);
}
public Padrao getPadrao1() {
return padrao1;
}
public void setPadrao1(Padrao padrao1) {
this.padrao1 = padrao1;
}
public Padrao getPadrao2() {
return padrao2;
}
public void setPadrao2(Padrao padrao2) {
this.padrao2 = padrao2;
}
}
Padrao.java
package servidor.logica.padrao;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
public class Padrao implements Serializable{
private Long id;
private List<Double> valoresDoPadrao;
public Padrao(){
this.valoresDoPadrao = new LinkedList<Double>();
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Padrao(List<Double> valoresDoPadrao){
this.valoresDoPadrao = valoresDoPadrao;
}
82
public List<Double> getValoresDoPadrao() {
return valoresDoPadrao;
}
public void setValoresDoPadrao(List<Double> valoresDoPadrao) {
this.valoresDoPadrao = valoresDoPadrao;
}
}
Usuário.java
package servidor.logica;
import servidor.logica.agrupamento.Circunferencia;
public class Usuario {
private Long id;
private Circunferencia circunferencia;
private String nome;
private String senha;
public Usuario(){
circunferencia = new Circunferencia();
}
public Circunferencia getCircunferencia() {
return circunferencia;
}
public void setCircunferencia(Circunferencia circunferencia) {
this.circunferencia = circunferencia;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
}
83
Dao.java
package servidor.modelo;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Dao<T>{
protected final Session session;
private final Class classe;
public Dao(Session session, Class classe) {
this.session = session;
this.classe = classe;
}
protected Session getSession(){
return this.session;
}
public void adiciona(T u){
Transaction t = session.beginTransaction();
session.save(u);
t.commit();
}
public List<T> listaTudo() {
return this.session.createCriteria(this.classe).list();
}
public T procura(Long id) {
return (T) session.load(this.classe, id);
}
public T procura(String nome, String senha) {
Query query = session.createQuery("from Usuario u where u.nome = :usuarioNome and u.senha =
:usuarioSenha");
query.setString("usuarioNome", nome);
query.setString("usuarioSenha", senha);
return (T) query.uniqueResult();
}
public void remove(T u) {
Transaction t = session.beginTransaction();
session.delete(u);
t.commit();
}
public void atualiza(T u) {
Transaction t = session.beginTransaction();
session.merge(u);
84
t.commit();
}
}
DaoFactory.java
package servidor.modelo;
import org.hibernate.Session;
import org.hibernate.Transaction;
import servidor.logica.Usuario;
public class DaoFactory {
private final Session session;
private Transaction transaction;
private Dao<Usuario> daoUsuario;
public DaoFactory() {
session = HibernateUtil.getSession();
}
public void beginTransaction() {
this.transaction = session.beginTransaction();
}
public void commit() {
this.transaction.commit();
this.transaction = null;
}
public boolean hasTransaction() {
return this.transaction != null;
}
public void rollback() {
this.transaction.rollback();
this.transaction = null;
}
public void close() {
this.session.close();
}
public Dao<Usuario> getUsuarioDao() {
return daoUsuario = new Dao<Usuario>(this.session, Usuario.class);
}
}
85
ServidorImpl.java
package servidor;
import java.io.IOException;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import rmi.Servidor;
import servidor.controle.Controle;
import servidor.logica.padrao.Padrao;
public class ServidorImpl implements Servidor{
private Controle controle;
public ServidorImpl(){
controle = new Controle();
inicia();
}
public void adicionaPadrao(List<Double> tempos) throws RemoteException {
controle.adicionaPadrao(tempos);
}
public boolean classifica(List<Double> tempos) throws RemoteException {
return controle.classifica(tempos);
}
public void salvaUsuario() throws RemoteException {
controle.salvaUsuario();
}
public boolean usuarioExitente(String nome, String senha) throws RemoteException {
return controle.usuarioExitente(nome, senha);
}
public void fechaSessaoComHibernate() throws RemoteException {
controle.fechaSessaoComHibernate();
}
public void criaCircunferencia() throws RemoteException {
controle.criaCircunferencia();
}
public void atribuiNomeESenha(String nome, String senha) throws RemoteException {
controle.atribuiNomeESenha(nome, senha);
86
}
public void inicia(){
try{
Servidor stub = (Servidor) UnicastRemoteObject.exportObject (this, 2500);
LocateRegistry.createRegistry(2500);
Registry registry = LocateRegistry.getRegistry(2500);
registry.bind ("Servidor15", stub);
System.out.println ("Servidor 15 iniciado?");
}catch(RemoteException Re){
System.out.println(Re.getMessage());
}catch(AlreadyBoundException ABe){
System.out.println(ABe.getMessage());
}catch(IOException IOe){
System.out.println(IOe.getMessage());
}
}
public static void main(String args[]){
new ServidorImpl ();
}
}
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.url">jdbc:postgresql://150.162.67.6/rodrigo4</property>
<property name="connection.username">pgsql</property>
<property name="connection.password"></property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
87
<!--property name="hbm2ddl.auto">create</property-->
<mapping resource="servidor/modelo/Usuario.hbm.xml"/>
<mapping resource="servidor/modelo/Padrao.hbm.xml"/>
</session-factory>
</hibernate-configuration>
HibernateUtil.java
package servidor.modelo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory factory;
static {
Configuration conf = new Configuration();
conf.configure();
factory = conf.buildSessionFactory();
}
public static Session getSession() {
return factory.openSession();
}
}
Circunferencia.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="servidor.logica.agrupamento.Circunferencia" table="circunferencia">
<id name="id"
column="id">
<generator class="foreign">
<param name="property">usuario</param>
</generator>
</id>
<property name="raio" type="double"/>
88
<one-to-one
name="centroide"
class="servidor.logica.padrao.Centroide" cascade="none" outer-join="auto"
constrained="true"/>
<one-to-one
name="usuario"
class="servidor.logica.Usuario" cascade="none" outer-join="auto" constrained="true"/>
<list name="padroes"
table="padroes" cascade="all">
<key column="idCircunferencia"/>
<index column="posn"/>
<one-to-many class="servidor.logica.padrao.Padrao" />
</list>
</class>
</hibernate-mapping>
Padrao.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="servidor.logica.padrao.Padrao" table="padrao">
<id name="id">
<column name="id" not-null="true"/>
<generator class="native" />
</id>
<list name="valoresDoPadrao"
table="valoresdopadrao" cascade="all">
<key column="idpadrao"/>
<index column="posn"/>
<element column="valoresdopadrao" type="double" />
</list>
</class>
</hibernate-mapping>
89
Usuario.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="servidor.logica.Usuario" table="usuario">
<id name="id">
<column name="id" not-null="true"/>
<generator class="native" />
</id>
<property name="nome" type="string"/>
<property name="senha" type="string"/>
<component name="circunferencia" class="servidor.logica.agrupamento.Circunferencia">
<property name="raio" type="double"/>
<list name="padroes"
table="padroes" cascade="all">
<key column="idCircunferencia"/>
<index column="posn"/>
<one-to-many class="servidor.logica.padrao.Padrao" />
</list>
<component name="centroide" class="servidor.logica.padrao.Padrao">
<list name="valoresDoPadrao"
table="valoresdocentroide" cascade="all">
<key column="idpadrao"/>
<index column="posn"/>
<element column="valoresdocentroide" type="double" />
</list>
</component>
</component>
</class>
</hibernate-mapping>
90
log4j.properties
#aqui esta a configuração para o log do hibernate
log4j.appender.hibernate=org.apache.log4j.FileAppender
log4j.appender.hibernate.File=hibernate.log
log4j.appender.hibernate.layout=org.apache.log4j.PatternLayout
log4j.appender.hibernate.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
#aponta os niveis de log para os pacotes específicos
log4j.rootLogger=fatal, hibernate
log4j.logger.org.hibernate=debug, hibernate
91
ANEXO B - ARTIGO
Dinâmica da Digitação Aplicada a Ambientes Web
Rodrigo Pavezi1, Douglas Dyllon J. de Macedo1,2, Rafael Andrade1,2,
Aldo von Wangenheim1
1
Departamento de Informática e Estatística – INE – Cyclops Group
Universidade Federal de Santa Catarina (UFSC) – Florianópolis, SC – Brasil
2
Programa de Pós-Graduação em Engenharia e Gestão do Conhecimento – PPGEGC
Universidade Federal de Santa Catarina (UFSC) – Florianópolis, SC – Brasil
{rsp,macedo,andrade,awangenh}@inf.ufsc.br
Abstract. The majority of the information systems, that need authentication for user,
had been conceived to use the data name of user and password, as authentication
process. Such process of authentication makes with that the systems currently are
considered little safe. The problem of this process of security has been the loss or the
robbery of the authentication data. It was thinking about this problem and, in some
form to decide it, that the present work aims at to develop a study of the keystroke
dynamic biometric technique, about which served of base for the creation of an applied
system of security environments WEB. The system was implemented using the technique
of classification K-nearest neighbor.
Resumo. A maioria dos sistemas de informação, que necessitam de autenticação por
usuário, foram concebidos para utilizarem os dados, nome de usuário e senha, como
processo de autenticação. Tal processo de autenticação faz com que os sistemas sejam
atualmente considerados pouco seguros. O problema desse processo de segurança tem
sido a perda ou o roubo dos dados de autenticação. Foi pensando neste problema e, em
alguma forma de resolvê-lo, que o presente trabalho visa desenvolver um estudo da
técnica biométrica dinâmica da digitação, na qual serviu de base para a criação de um
sistema de segurança aplicado a ambientes WEB. O sistema foi implementado
utilizando a técnica de classificação k vizinhos mais próximos.
1. Introdução
Pessoas que utilizam a Internet em seu cotidiano necessitam de bons níveis de segurança para
proteger as informações que estão sendo acessadas. Esta segurança deve ser oferecida pelos
sistemas que guardam e gerenciam tais informações, com o foco principal para os que estão
presentes na Internet, onde o acesso é compartilhado por diversas pessoas.
Alguns desses sistemas como o prontuário eletrônico de paciente (PEP), bancos on-line e
gerenciadores de e-mail, exigem uma preocupação muito grande por parte das empresas que
administram essas informações. Desta forma, para garantir a constante evolução dos negócios,
investimentos em tecnologias de segurança são altamente necessários. Observando, por exemplo,
92
o PEP pela ótica de segurança, tem o seu tripé básico: a autenticidade, integridade e
confidencialidade que são assegurados com o uso de assinatura eletrônica, protocolação digital e
criptografia com chave certificada, respectivamente. Porém, com o crescimento dos ataques por
parte de usuários mal intencionados, vemos a necessidade de criação de um controle de acesso
mais eficiente. Sendo que esta é uma das áreas que atrai grande interesse de pesquisadores nos
últimos anos [Beznosov 1999].
Uma das formas de elevar os níveis de segurança é através do uso de técnicas biométricas.
As técnicas biométricas têm o objetivo de aumentar a segurança entre usuários e sistemas. De
acordo com Faundez-Zanuy (2006), a palavra biometria vem das palavras gregas: “bios” (vida) e
“metrikos” (medida). Ou seja, uma ciência que envolve uma análise estatística das características
biológicas, estudando as características físicas e comportamentais do ser humano com o intuito
de identificá-lo.
O custo aliado aos níveis de segurança que serão implantados, são requisitos de extrema
importância para sistemas. Por este motivo, analisar qual técnica biométrica se adapta melhor ao
sistema é fundamental para o sucesso do projeto. Umas das técnicas biométricas que vem sendo
muito utilizada é a impressão digital, tanto pelo fato desta técnica ter um custo acessível, como
também, por ter uma precisão aceitável [Moore 2007].
Para aplicações em ambientes Web a utilização da técnica de impressão digital não seria
muito viável, pois necessita de um equipamento para ler a impressão e neste caso todos os
computadores com acesso a Internet teriam que ter tal leitor, o que inviabilizaria sua utilização
em larga escala.
Uma outra técnica biométrica é a dinâmica da digitação (Keystroke Dynamics) que é
baseada no comportamento do ser humano ao digitar em um teclado. Jarmo Ilonen (2003) define
dinâmica da digitação como uma biometria baseada na suposição em que pessoas diferentes
digitam de maneiras características. Em seus estudos, ele também relata que no século 19, os
operadores de telégrafo já tinham padrões de telegrafar, com isso, um operador reconhecia o
outro. Isso caracteriza o marco inicial da idéia de dinâmica da digitação.
No presente trabalho é desenvolvido um sistema de autenticação baseado na técnica
biométrica dinâmica da digitação. Este sistema foi implementado em versão para Internet, com o
objetivo de aumentar os níveis de segurança dos sistemas de autenticação atualmente utilizados.
2. Trabalhos Relacionados
Conforme Jarmo Ilonen (2003) há várias maneiras de medir a dinâmica da digitação quando os
usuários digitam em um teclado normal de um computador. Algumas das maneiras são:
O intervalo de tempo entre o pressionamento de teclas consecutivas;
O tempo que uma tecla fica pressionada;
O tempo total da digitação;
A freqüência da digitação de teclas erradas;
O hábito de usar teclas diferentes do teclado.
Revett et al. (2005) citado por Magalhães et al. (2005), concluiu que dividindo o teclado
de um computador em setores, reduz-se a taxa de sucesso de impostores (False Acceptance Rate -
93
FAR). As senhas que tem dígitos em cada setor forçam os usuários a utilizarem teclas que estão
dispersas pelo teclado, garantindo uma melhor captura do ritmo de digitação dos usuários.
Além da forma de captura, tem também o processo de captura, ou seja, o treinamento do
classificador. Temos dois tipos de processos. Em um dos processos se utiliza a digitação de um
texto durante o treinamento [Curtin 2006]. No outro é utilizado a própria senha cadastrada pelo
usuário [Cho 2000].
Haider, Abbas e Zaidi (2000) em seus estudos utilizam a captura dos tempos de
pressionamento entre as teclas. O padrão de digitação do usuário foi formado por n-1 vetores,
sendo n, o número de dígitos que compõe a senha. Também se trabalhou com um classificador
que utilizava três diferentes técnicas de reconhecimento de padrões: lógica fuzzy, redes neurais e
métodos estatísticos. As avaliações foram feitas sobre cada técnica separadamente e sobre a união
das três técnicas.
Os testes mostraram que a união das três técnicas no processo de classificação obteve um
melhor resultado do que a utilização de qualquer uma delas separadamente. Em relação à
utilização em separado a técnica que obteve o melhor resultado foi à baseada em métodos
estatísticos. Foram feitos dois testes, no primeiro a rejeição de acesso ao sistema na primeira
tentativa de ingresso do usuário era contabilizada como erro, no segundo teste os usuários tinham
duas chances de acesso. Os resultados mostraram que geralmente os usuários válidos são
rejeitados na primeira vez [Haider 2000].
No trabalho de Cho (2000), foi desenvolvido um sistema para um ambiente Web, o qual
foi implementado com duas técnicas de classificação: medida de distância do vizinho mais
próximo e uma rede MLP (Multi Layer Perceptron). Os testes foram feitos com 21 usuários que
tiveram um número de padrões de treinamento variando entre 76 a 388. Os resultados apontaram
por uma superioridade da rede MLP sobre a medida de distância. Sendo que foi estabelecido
índice de erro para falsa aceitação como 0,0% , a média do erro para falsa rejeição no caso da
MLP foi de 1,0% e da técnica do vizinho mais próximo foi de 19,5%.
Cavalcanti (2005) mostrou em seu trabalho a típica extração do ritmo de digitação do
usuário. A técnica utilizada foi capturar os tempos de pressionamento de cada tecla e o intervalo
de tempo entre o pressionamento entre cada tecla. Também foi desenvolvido um sistema que
utiliza uma normalização e uma seleção baseada no desvio padrão das características capturadas.
Esses dois passos são feitos antes da aplicação de uma medida de distância como classificador. .
Os resultados mostraram que com o índice de falsa aceitação igual a zero, o erro falsa rejeição
atingiu 6,04% quando utilizadas a normalização e a seleção. Já sem os dois passos o erro de falsa
rejeição atingiu 30,99%.
3. Metodologia
De acordo com Cavalcanti (2005), os ritmos de digitação dos usuários, podem ser capturados a
partir de duas diferentes medidas que contabilizam o tempo. Uma contabiliza o tempo que os
usuários mantêm cada tecla pressionada. A outra contabiliza o intervalo de tempo entre uma tecla
e outra que são consecutivamente pressionadas.
Após a captura do ritmo de digitação, os tempos formam um vetor, o qual caracterizara o
padrão do usuário para o sistema classificador. Esse vetor composto pelos tempos tem um
tamanho dependente da quantidade de teclas que foram pressionadas. Com isso podemos formar
uma equação onde, com n teclas pressionadas, o tamanho do vetor ou a quantidade de tempos vai
94
ser igual a 2n – 1. Por exemplo, uma senha de seis dígitos formará um vetor composto por 11
tempos, sendo que, seis são tempos de pressionamento de teclas e 5 são intervalos de tempos
entre teclas pressionadas consecutivamente.
A classificação foi efetuada através da utilização do algoritmo k vizinhos mais próximos
(K-Nearest Neighbor – K-nn). O K-nn é um algoritmo de aprendizado supervisionado
pertencente à área de reconhecimento de padrões. O algoritmo necessita que os padrões estejam
representados na forma de objetos do espaço dimensional, ou seja, na forma de um vetor de n
dimensões.
O K-nn classifica os padrões através dos k vizinhos mais próximos do conjunto de
treinamento, ou seja, dado um padrão x, são encontrados os k padrões contidos no conjunto de
treinamento mais próximo de x. Diante disto, a classe mais freqüente dentre os k padrões será
atribuída ao padrão x. Para encontrar os k vizinhos mais próximos o algoritmo utiliza uma técnica
de medida de distância, neste caso, a distância euclidiana.
A Figura 1 demonstra essa classificação, sendo que, o ponto Xu é o padrão a ser
classificado e cada seta representa a ligação com os seus vizinhos mais próximos. Neste caso,
como a variável k foi atribuída com o valor 5, o algoritmo K-nn encontrou os cinco pontos mais
próximos de Xu. Sendo que dos 5 mais próximos, quatro pertencem a classe dos padrões
vermelhos e um pertence a classe dos verdes. O padrão Xu será classificado como um ponto
vermelho, pois ele se encontra mais perto dos vermelhos do que dos demais.
Figura 16 - Um padrão Xu e seus vizinhos mais próximos.
A idéia de desenvolver o algoritmo K-nn, vem da tentativa de proporcionar uma
classificação a partir de um confronto entre os padrões treinados. Onde, todos os padrões
capturados de todos os usuários serviram de comparação para a classificação. Isso faz como que
o conjunto dos padrões ou descritor conceitual esteja na memória em tempo de execução da
classificação.
Nesse artigo foi limitado o tamanho da senha em 6 dígitos pelo fato de a medida de
distância utilizada pelo algoritmo K-nn só aceitar padrões de mesma dimensão. Com isso todos
os padrões dos usuários são formados por um vetor de 11 tempos.
95
3.1 Parâmetros de Avaliação
Toda técnica biométrica tem as suas vantagens e desvantagens. Pois nenhum aprendizado de
máquina ou cálculo estatístico é 100% correto, sendo assim sempre se tem uma margem de erro.
O importante é saber se essa margem de erro afeta, de maneira considerável, a utilização do
sistema que implementa a técnica biométrica [Moore 2007].
Um sistema de autenticação não pode aceitar intrusos, como também, não pode rejeitar os
verdadeiros usuários do sistema. Tais situações devem ser testadas e analisadas como erros da
técnica desenvolvida. De acordo com Cavalcanti (2005) uma forma de testar uma especifica
técnica, é avaliar os erros:
Falsa Aceitação (FAR - False Acceptance Rate): quando um sistema de autenticação
aceita ou autentica um impostor como um usuário cadastrado no sistema.
Falsa Rejeição (FRR - False Rejection Rate): quando um sistema de autenticação rejeita
um usuário válido cadastrado no sistema.
3.2 Visão Geral do Sistema
A dinâmica da digitação aplicada a ambientes Web tem como vantagem dar uma maior segurança
para o portal. Na Figura 2 é mostrado o diagrama de atividades do sistema desenvolvido. Nesse
diagrama temos o módulo de autenticação que é dividido em dois processos separados e que são
representadas como páginas separadas no sistema.
Quando um novo usuário necessita cadastrar-se no sistema é necessário que ele faça um
treino, que nada mais é que, a digitação repetitiva da senha que ele mesmo escolheu. Durante a
fase de treino o usuário entra com um nome de usuário e escolhe uma senha, que deve ser
composta por 6 dígitos. A digitação deve ser repetida 5 vezes ou mais. A senha foi limitada em 6
dígitos, devido ao algoritmo K-nn. Após o treino, o padrão de digitação e o nome do usuário são
armazenados no banco de dados. Usuários que já são cadastrados no sistema devem ir para a tela
de acesso. Sendo necessário que o usuário entre com nome de usuário e a senha, mas a senha
deve ser digitada como foi previamente digitada na situação de treino. No acesso, após a captura
dos tempos na entrada da senha, o sistema procura o usuário no banco de dados e se o usuário
existir, então o sistema faz a classificação através da dinâmica de digitação. Se o usuário for
classificado como verdadeiro, então é liberado o acesso ao sistema para o usuário, senão o
sistema rejeita o usuário (figura 2).
O sistema é composto por duas páginas, onde cada uma possui um Applet, e um servidor
RMI (Remote Method Invocation). O Applet de treinamento e o Applet de acesso tiveram que ser
assinados digitalmente por causa da conexão entre eles e o servidor RMI. É através dessa
conexão que cada Applet envia para o servidor o vetor de tempos do usuário.
96
Figura 2 – Diagrama de atividades.
A Figura 3 demonstra a arquitetura do sistema. Como se trata de um ambiente Web,
temos uma situação de cliente-servidor, nessa situação temos o navegador na parte cliente, que
contém um Java Applet, o qual se comunica com o servidor através do navegador e de uma
conexão remota com uma aplicação que é um servidor RMI. Esse servidor RMI faz a conexão
com o banco de dados.
Figura 3 - Arquitetura do sistema.
97
4. Resultados
Na avaliação do sistema e do classificador K-nn foi efetuado um teste prático, no qual os usuários
se cadastravam no sistema e depois tentavam obter o acesso. Também foi pedido a eles que
fizessem uma tentativa de acesso com o nome de usuário e senha de um outro usuário cadastrado
no sistema.
Para avaliar o algoritmo de classificação foram feitos dois testes, um como uma entrada
de cinco repetições no treinamento e outro com uma entrada de dez repetições no treinamento.
Para o treinamento com cinco repetições foi atribuído o valor 5 (cinco) para o k do classificador,
ou seja, o classificador K-nn procurou os cinco padrões mais semelhantes. Já para o treinamento
com dez repetições foi atribuído o valor 10 (dez) para o k.
Para computar a avaliação, nas telas de aceitação e rejeição de acesso, foi adicionado um
formulário, no qual servia para saber se o usuário que foi rejeitado ou aceito era um usuário
válido ou um intruso tentando ter acesso. Cada vez que um usuário válido era rejeitado, um erro
de falsa rejeição (FRR) era computado. Quando um intruso era aceito pelo sistema, um erro de
falsa aceitação (FAR) era computado.
Os testes foram feitos com um total de 20 (vinte) usuários e um total de 100 (cem)
tentativas, cada pessoa fez o seu cadastro nos dois sistemas, um com 5 repetições e outro com 10
repetições da senha durante o treinamento. Depois, cada pessoa tinha uma tentativa de acessar
com o seu próprio usuário e outra tentativa de acessar com os dados de outro usuário, ou seja,
como um intruso. Em alguns casos ouve repetição desse procedimento de acesso.
A Tabela 1 mostra as variáveis estatísticas e os resultados obtidos em cima dos testes
realizados. A principal comparação é feita sobre os valores de erros (FAR e FRR) e a quantidade
de repetições durante o treino. Nos outros valores temos a relação entre a quantidade de tentativas
como usuário verídico e como usuário intruso, onde dessas tentativas temos a quantidade de falsa
aceitação e falsa rejeição.
Tabela 6 - Resultados dos testes.
Quantidade de Tentativas
Tentativas
tentativas como verídico como intruso
5 repetições no treino
10 repetições no treino
100
100
50
50
50
50
Quantidade de
falsa aceitação
Quantidade de
falsa rejeição
FAR
FRR
5
8
13
15
10,00%
16,00%
26,00%
30,00%
Na Figura 4 é mostrado um comparativo entre os erros do tipo FAR e FRR que ocorreram
durantes os testes com 5 repetições e 10 repetições. Percebemos que entre os dois testes houve
um aumento de 6% no valor do tipo de erro FAR e um aumento de 4% no tipo de erro FRR. Isso
demonstra que o aumento de repetições durante o treinamento fez com que o sistema aceitasse
mais usuários intrusos e rejeitasse mais usuários verídicos.
98
35,00%
30,00%
30,00%
26,00%
25,00%
20,00%
16,00%
FAR
FRR
15,00%
10,00%
10,00%
5,00%
0,00%
5 repetições no treino
10 repetições no treino
Figura 4 – Gráfico comparativo dos testes.
6. Conclusões e trabalhos futuros
O estudo da dinâmica da digitação e outras técnicas biométricas mostram que a técnica da
dinâmica da digitação é uma técnica de custo baixo, mas que garante uma elevação significativa
nos níveis de segurança dos sistemas. Isso é fundamental para sistemas que estão na Web. A cada
dia mais sistemas estão sendo criados na Internet e o sistema protótipo criado neste trabalho pode
perfeitamente ser utilizado em produção, pois a sua arquitetura garante um bom funcionamento.
A intenção de combater o padrão de um usuário com o outro, utilizando a técnica de
classificação K-nn, não obteve bons resultados se comparado com os trabalhos relacionados.
Pode-se observar que os testes com o sistema que tinha um treinamento com 5 repetições
obtiveram uma taxa menor de erro aos testes que tinham treinamento com 10 repetições.
Para trabalhos futuros é importante o desenvolvimento de um classificador que venha a
melhorar o processo de classificação. Esse classificador poderia ser implementado com a
característica de verificar uma pequena mudança temporal do padrão do usuário e aprender essa
mudança. Pode-se também, melhorar a etapa de treinamento, sendo que, no lugar de treinar o
usuário no cadastro, o treino seria realizado durantes os primeiros acessos do usuário ao sistema.
Referências
Beznosov, K.; Deng, Y.; Blakley, B.; Burt, C. e Barkley, J. “A Resource Access Decision Service
for CORBA-based Distributed Systems”, Proceedings. of the 15th Annual Computer Security
Applications Conference (ACSAC '99)., (1999), 310-319.
Cavalcanti, George D. C.; Pinheiro, Eggo H. F.; Carvalho, Edson C. B. (2005) “Um sistema de
verificação de identidade pessoal através de dinâmica da digitação”. Em XXV Congresso da
Sociedade Brasileira de Computação.
Cho, Sungzoon et al. (2000) “Web based Keystroke Dynamics Identity Verification using Neural
Network”. Em Journal of Organizational Computing and Electronic Commerce, v. 10, n. 4, p.
295-307.
99
Curtin, Mary et al. (2006) “Keystroke Biometric Recognition on Long-Text Input: A Feasibility
Study”. Proc. Int. Workshop Sci Comp/Comp Stat (IWSCCS 2006), Hong Kong, June 2006.
Faundez Z., M. (2006) “Biometric security technology”, IEEE Aerospace and Electronic Systems
Magazine, v. 21, n. 6, p. 15-26.
Haider, S.; Abbas, A.; Zaidi, A.K. (2000) “A multi-technique approach for user identification
through keystroke dynamics. Systems, Man, and Cybernetics”, IEEE International Conference
on, v. 2, p.1336-1341.
Ilonen
Jarmo
(2003)
“Keystroke
04/010970000/seminars/Ilonen.pdf, Outubro.
Dynamics”,
http://www.it.lut.fi/kurssit/03-
Magalhães, S. T.; Revett, Kenneth; Santos, Henrique M. D. (2005) “Password Secured Sites –
Stepping Forward With Keystroke Dynamics”, Proceedings of the International Conference
on Next Generation Web Services Practices.
Moore, A. M. (2007) “Biometric technologies — an introduction”. Em Biometric Technology
Today, v. 15, n. 1, p. 6-7.
Revett, K. and Khan, A. (2005) “Enhancing login compatible with those produced by very
expensive security using keystroke hardening and keyboard gridding”, Proceedings of the
IADIS MCCSIS.
This document was created with Win2PDF available at http://www.win2pdf.com.
The unregistered version of Win2PDF is for evaluation or non-commercial use only.
This page will not be added after purchasing Win2PDF.
Download