Danilo Souza Lima
Proposta para controle de acesso físico seguro
baseada em Near Field Communication (NFC)
e Android
São Carlos
2013
Danilo Souza Lima
Proposta para controle de acesso físico seguro baseada
em Near Field Communication (NFC) e Android
Trabalho de Conclusão de Curso apresentado
ao departamento de Engenharia elétrica da
Escola de Engenharia de São Carlos - USP
Universidade de São Paulo – USP
Escola de Engenharia de São Carlos – EESC
Orientador: Evandro L. L. Rodrigues
São Carlos
2013
AUTORIZO A REPRODUÇÃO TOTAL OU PARCIAL DESTE TRABALHO,
POR QUALQUER MEIO CONVENCIONAL OU ELETRÔNICO, PARA FINS
DE ESTUDO E PESQUISA, DESDE QUE CITADA A FONTE.
L732p
Lima, Danilo Souza
Proposta para controle de acesso físico seguro
baseada em Near Field Communication (NFC) e Android /
Danilo Souza Lima; orientador Evandro L. L. Rodrigues.
São Carlos, 2013.
Monografia (Graduação em Engenharia Elétrica com
ênfase em Eletrônica) -- Escola de Engenharia de São
Carlos da Universidade de São Paulo, 2013.
1. NFC. 2. Arduino. 3. Android. 4. Criptografia. 5.
Autenticação. I. Título.
-
FOLHA DE APROVAÇAO
Nome: Danilo Souza Lima
Título: "Segurança e controle de acesso de pessoas com utilização
de dispositivo móvel com NFC"
Trabalho de Conclusão de Curso defendido e aprovado
em 21 I_li 120.1d ,
com NOTA
Q3
C--~Ullte,
s
-fct
l, pela
Comissão Julgadora:
Prot. Associado Evandro Luís Linhari Rodrigues - (Orientador SEUEESC/USP)
Prof. Associado Adilson Gonzaga - (SEUEESC/USP)
Prot. Dr. Marcelo Andrade da Costa Vieira - (SEUEESC/USP)
Coordenador da CoC-Engenharia Elétrica - EESC/USP:
Prof. Associado Homero Schiabel
,
Agradecimentos
Agradeço aos meus pais, pelo incentivo durante o curso,
Ao tio "Jota", pela ajuda com técnicas de segurança e servidor Web,
Ao Bruno "Tintim", pela presteza em compartilhar seus recursos de trabalho,
Ao André Carmona, pelos comentários sempre valiosos,
Ao Bruno Kim e à Luzia pela ajuda com C++ e LATEX,
Ao Rodrigo, pelas excelentes dicas de Hardware,
E ao professor Evandro, pelas ótimas orientações e ricas discussões durante nossas
"Walking Meetings".
“A common mistake people make when trying
to design something completely foolproof is to
underestimate the ingenuity of complete fools.”
(Douglas Adams, Mostly Harmless)
Resumo
O trabalho de conclusão de curso apresentado elabora uma proposta para
controle de acesso físico segura e intuitiva com a utilização de um aparelho celular.
Para garantir a segurança e intuitividade do processo utilizou-se o Near Field Communication, que é uma comunicação via rádio-frequência com área de ação limitada
em no máximo 10cm. O objetivo final do projeto foi propor um método completo
para elaboração do sistema de controle de acesso, que deve servir como prova de
conceito e não como um produto comercial. Ele envolve a elaboração de um terminal
de acesso baseado em Arduino com Shield NFC além da criação de um aplicativo
móvel para Android e um website para gerenciamento. As principais dificuldades
do projeto foram a implementação dos protocolos de comunicação peer-to-peer NFC
em baixo nível e a implementação da segurança do sistema baseada em algoritmos
de criptografia. Foram utilizadas as linguagens de programação C++, JAVA e PHP
e os softwares envolvidos foram elaborados utilizando o modelo de prototipagem. O
trabalho foi testado utilizando-se um celular Galaxy SIII da Samsung, e o tempo de
comunicação com o terminal foi medido em torno de 5,5s. O NFC se mostrou uma
maneira prática e intuitiva para o projeto proposto. Com os resultados alcançados
foi possível identificar caminhos para a evolução do projeto conforme podem ser
observados no capítulo de conclusão.
Palavras-chaves: NFC, Arduino, Android, Criptografia, Autenticação
Abstract
The work presented here intend to propose a tool for physical access control that is safe and intuitive. For that end, the process makes use of Near Field
Communication, that is a Radio Frequency communication with a limited range of
no more than 10cm. The main goal of the project is to propose a method to be
used as a proof of concept and not as a stand alone comercial solution. It envolves
the elaboration of a physical access terminal based on the Arduino board with NFC
capability and the creation of an Android app and a website for administration.
The dificulties associated with the work were the implementation of low level protocols of NFC peer-to-peer comunication and the implementation of the security of
the system based on well-known public criptographic algorithms The programing
languages that were used on the elaboration of the softwares were C++, JAVA and
PHP and they were made by using the process of prototyping. The comunication
was testes by using a Samsung Galaxy SIII mobile phone and time needed for the
comunication was measured in about 5.5s. The NFC was a proved to be a effective
tool for a praticity and intuitivity in the project. It was possible to indetify ways
for improvenement of the work that can be seen in the conclusion chapter.
Key-words: NFC, Android, Arduino, Criptography, Autentication.
Lista de ilustrações
Figura 1 – Google Wallet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Figura 2 – Comunicações Envolvidas . . . . . . . . . . . . . . . . . . . . . . . . . 26
Figura 3 – OSI vs NFC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Figura 4 – Funcionamento do NFC. . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Figura 5 – Modulação Digital OOK. . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Figura 6 – Arquitetura LLCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Figura 7 – Representação de um PDU
. . . . . . . . . . . . . . . . . . . . . . . . 33
Figura 8 – Representação do SNEP . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Figura 9 – Mensagem NDEF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Figura 10 – Tela de confirmação de envio de dados do Android Beam . . . . . . . . 41
Figura 11 – O modelo de criptografia . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Figura 12 – Estágios intermediários do DES . . . . . . . . . . . . . . . . . . . . . . 44
Figura 13 – Troca de chave de Diffie-Hellman . . . . . . . . . . . . . . . . . . . . . 45
Figura 14 – Ataque Man In The Middle . . . . . . . . . . . . . . . . . . . . . . . . 46
Figura 15 – Autenticação baseada em chave compartilhada . . . . . . . . . . . . . . 48
Figura 16 – Diagrama esquemático . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Figura 17 – Arduino R3 UNO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Figura 18 – Arduino MEGA 2560 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Figura 19 – Arduino DUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Figura 20 – Shield NFC para o Arduino . . . . . . . . . . . . . . . . . . . . . . . . 56
Figura 21 – Shield de prototipação para Arduino . . . . . . . . . . . . . . . . . . . 57
Figura 22 – Relay 5V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Figura 23 – Primeiro Protótipo do Terminal . . . . . . . . . . . . . . . . . . . . . . 57
Figura 24 – Blocos do sistema desmontado . . . . . . . . . . . . . . . . . . . . . . . 59
Figura 25 – Placa Montada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Figura 26 – Sistema em funcionamento . . . . . . . . . . . . . . . . . . . . . . . . . 60
Figura 27 – IDE para o Arduino. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Figura 28 – IDE do Code::Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Figura 29 – Esquema de geração de chave para criptografia . . . . . . . . . . . . . 66
Figura 30 – IDE Eclipse para programação em Android. . . . . . . . . . . . . . . . 70
Figura 31 – IDE - NETBeans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Figura 32 – Diagrama Entidade-Relacionamento
. . . . . . . . . . . . . . . . . . . 76
Figura 33 – Primeira tela do aplicativo WEB . . . . . . . . . . . . . . . . . . . . . 76
Figura 34 – Administração das Fechaduras . . . . . . . . . . . . . . . . . . . . . . . 76
Figura 35 – Modificar Status de usuários . . . . . . . . . . . . . . . . . . . . . . . . 77
Figura 36 – Histograma dos dados da tabela 19 . . . . . . . . . . . . . . . . . . . . 84
Lista de tabelas
Tabela
Tabela
Tabela
Tabela
Tabela
Tabela
Tabela
Tabela
Tabela
Tabela
1 – Formato para um PDU tipo PAX . . . . . . . . . .
2 – Formato para um PDU tipo CONNECT . . . . . .
3 – Formato para um PDU tipo DISC . . . . . . . . .
4 – Formato para um PDU tipo I . . . . . . . . . . . .
5 – Formato para um PDU tipo I . . . . . . . . . . . .
6 – Formato de uma solicitação SNEP . . . . . . . . .
7 – Formato de uma resposta SNEP . . . . . . . . . .
8 – Comandos de solicitação . . . . . . . . . . . . . . .
9 – Comandos de Resposta . . . . . . . . . . . . . . . .
10 – Formato do Identificador de uma Gravação NDEF
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
34
34
34
34
35
35
35
37
37
38
Tabela
Tabela
Tabela
Tabela
Tabela
Tabela
Tabela
Tabela
11
12
13
14
15
16
17
18
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
55
61
62
62
62
62
69
69
– Características dos três Arduinos trabalhados
– Sintaxe do Comando InitAsTarget . . . . . .
– Sintaxe para o comando GetData . . . . . . .
– Sintaxe para a resposta do comando GetData
– Sintaxe para o comando SetData . . . . . . .
– Sintaxe para a resposta do comando SetData
– Sintaxe do protocolo criado . . . . . . . . . .
– Sintaxe autorização do servidor . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Tabela 19 – Testes de comunicação NFC . . . . . . . . . . . . . . . . . . . . . . . . 83
Tabela 20 – Média de tempo de comunicação com o aplicativo WEB . . . . . . . . 84
Lista de Algoritmos
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11
3.12
3.13
Algoritmo de Conexão como Cliente SNEP . . . . . .
Algoritmo de Conexão como Servidor SNEP . . . . .
Algoritmo de recepção de dados . . . . . . . . . . . .
Algoritmo de Envio de dados . . . . . . . . . . . . .
Algoritmo de PUSH . . . . . . . . . . . . . . . . . .
Algoritmo de PULL . . . . . . . . . . . . . . . . . . .
Uso da Biblioteca AES . . . . . . . . . . . . . . . . .
Uso da Biblioteca HASH MD5 . . . . . . . . . . . . .
Algoritmo de Envio de dados . . . . . . . . . . . . .
Algoritmo Para uso do Beam𝑇 𝑀 no Android . . . . .
Segundo algoritmo Para uso do Beam𝑇 𝑀 no Android
Recebimento de mensagens NDEF com Android . . .
Recebimento de mensagens NDEF com Android . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
63
63
64
64
64
65
66
67
68
71
72
72
73
Lista de abreviaturas e siglas
NFC
Near Field Communication.
RFID
Radio Frequency IDentification.
NDEF
NFC Data Exchange Format.
DES
Data Encryption Standard.
RSA
Rivest, Shamir e Adleman. (Criadores desse método de criptografia)
P2P
peer-to-peer.
AES
Advanced Encription Standard.
MD5
Message Digest 5.
OOK
On-Off key.
LLCP
Link Layer Control Protocol.
SHA
Secure Hash Algorithm.
PHP
PHP: Hypertext Preprocessor.
HTML
HyperText Markup Language.
SNEP
Simple NDEF Exchange Protocol.
OSI
Open Systems Interconnection.
Lista de símbolos
⊕
OU EXCLUSIVO.
𝐸𝑘
Método de criptografia com a chave 𝑘.
𝐷𝑘
Método de decriptografia com a chave 𝑘.
Sumário
1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2 Embasamento Teórico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1
2.2
2.3
Near Field Communication . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1.1
Histórico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1.2
Funcionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.1.2.1
Camada Física (Hardware) . . . . . . . . . . . . . . . . . 30
2.1.2.2
Camada de enlace de Dados . . . . . . . . . . . . . . . . . 32
2.1.2.3
Camada de Aplicação . . . . . . . . . . . . . . . . . . . . 35
O sistema operacional Android
. . . . . . . . . . . . . . . . . . . . . . . . 39
2.2.1
Aplicativos Android
. . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.2.2
Android e NFC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.2.2.1
Android Beam𝑇 𝑀 . . . . . . . . . . . . . . . . . . . . . . . 40
2.2.2.2
Dispositivos com chip NFC . . . . . . . . . . . . . . . . . 40
Segurança e criptografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.3.1
2.3.2
Métodos de criptografia . . . . . . . . . . . . . . . . . . . . . . . . 41
2.3.1.1
Método DES . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.3.1.2
Método de compartilhamento de Chave de Diffie-Hellman
2.3.1.3
Métodos de chave pública . . . . . . . . . . . . . . . . . . 45
2.3.1.4
Algorítmos de HASH criptográficos . . . . . . . . . . . . . 47
44
Autenticação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.3.2.1
Autenticação baseada em chave compartilhada . . . . . . . 48
2.3.2.2
Autenticador de uma mensagem . . . . . . . . . . . . . . . 49
3 Metodologia e Implementação . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.1
Descrição do Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.1.1
3.2
3.3
Especificação de Requisitos do Projeto . . . . . . . . . . . . . . . . 52
3.1.1.1
Requisitos Não-funcionais . . . . . . . . . . . . . . . . . . 52
3.1.1.2
Requisitos Funcionais . . . . . . . . . . . . . . . . . . . . 53
Hardware para a fechadura . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.2.1
O Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
3.2.2
O PN532
3.2.3
Primeiro Protótipo . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
3.2.4
O protótipo Final . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Software para o Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.3.1
Implementação da Biblioteca para comunicação peer-to-peer NFC . 60
3.4
3.5
3.6
3.7
3.3.1.1 Comunicação com o PN532 . . . . . .
3.3.1.2 LLCP . . . . . . . . . . . . . . . . . .
3.3.1.3 SNEP . . . . . . . . . . . . . . . . . .
3.3.1.4 NDEF . . . . . . . . . . . . . . . . . .
3.3.2 Implementação da Criptografia . . . . . . . . .
3.3.2.1 Implementação da Biblioteca AES . .
3.3.2.2 Implementação da biblioteca MD5 . .
Algoritmo do Sistema Completo . . . . . . . . . . . . .
Protocolo criado para comunicação e autenticação . . .
3.5.1 Mensagem e assinatura do servidor . . . . . . .
3.5.2 Assinatura do Aplicativo . . . . . . . . . . . . .
Aplicativo para Android . . . . . . . . . . . . . . . . .
3.6.1 Envio de uma mensagem NDEF com o Beam𝑇 𝑀
3.6.2 Recebimento de uma mensagem NDEF . . . . .
3.6.3 Comunicação com o Servidor . . . . . . . . . .
Aplicativo web . . . . . . . . . . . . . . . . . . . . . .
3.7.1 Banco de Dados . . . . . . . . . . . . . . . . . .
3.7.2 A interface . . . . . . . . . . . . . . . . . . . . .
4 Resultados e Testes . . . . . .
4.1 Comunicação NFC . . . . .
4.2 Testes da comunicação NFC
4.3 Comunicação com o servidor
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
60
62
64
65
65
66
67
68
69
69
70
70
71
72
73
75
75
76
. . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
79
79
82
84
5 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Apêndices
93
APÊNDICE A Esquemático do Primeiro Protótipo do Terminal . . . . . . . . 95
APÊNDICE B Esquemático do Protótipo Final do Terminal . . . . . . . . . . 97
25
1 Introdução
Desde que surgiram os primeiros aparelhos celulares, uma forte tendência foi observada no mercado, a substituição de outros aparelhos que eram comuns ao nosso dia à dia.
Calculadoras, agendas telefônicas, calendários e câmeras fotográficas, por exemplo, hoje
são encontrados mais facilmente em sua forma digital, reunidos em um único aparelho.
O telefone móvel já é utilizados para muito mais funções que quando foi proposto
comercialmente em 1983.
Essa tendência do uso de apenas uma estrutura para prover diversos serviços é
chamada Convergência Tecnológica, e um exemplo atual são os novos métodos de pagamento de mercadorias, como o Google Wallet (GOOGLE. . . , 2013) que pode ser vista na
figura 1. Dessa forma, o dispositivo móvel pode substituir, também, um cartão de crédito,
ou uma carteira.
Figura 1: Google Wallet: Pagamento via celular
Fonte: http://www.extremetech.com/
A motivação deste trabalho é incluir no celular uma nova função além destas
muitas que já foram citadas, a de dispositivo de controle de acesso.
É claro que não há objetivo de implementar um produto comercial, mas de servir
como uma prova de conceito e abrir um leque de possibilidades para futuras implementações.
Dois elementos básicos utilizados nesse trabalho são o celular, utilizado como dispositivo de controle de acesso, e o terminal de controle de acesso. Para confecção deste,
foi decidido por utilizar uma placa baseada no Arduino, pela facilidade de encontrar
periféricos e pela quantidade de bibliotecas disponíveis.
26
Capítulo 1. Introdução
A comunicação entre o terminal e o celular deve ser feita de forma segura e intuitiva. A ideia central é ter seu acesso garantido apenas aproximando o celular do terminal,
isso é possível graças a comunicação NFC (KUMAR, 2011), acrônimo para Near Field
Communication, que será discutido nas próximas seções.
O NFC já é utilizado em celulares para várias funções, a principal delas é a leitura
de cartões baseados nesta tecnologia, que podem funcionar como cartões de visita ou de
informações de murais eletrônicos.
Para implementação de um sistema mais completo, deve-se incluir, também, a
possibilidade de gerenciamento das autorizações através da internet. A figura 2 mostra
um diagrama de todas as comunicações envolvidas no projeto.
Figura 2: Comunicações Envolvidas
Para que todos os elementos do projeto funcionem corretamente, é necessário que
exista um protocolo de comunicação seguro e unificado. Este protocolo deve envolver
algoritmos criptográficos para garantir segurança do sistema.
Ao decorrer desse trabalho serão apresentadas todas as etapas de elaboração do
projeto, que inclui:
∙ Projeto e montagem do hardware para ser utilizado no terminal.
∙ Criação do software para comunicação via NFC.
∙ Criação de bibliotecas para criptografia e segurança das informações.
∙ Confecção de um aplicativo móvel para o sistema operacional Android, que deve
funcionar como interface entre o usuário e a fechadura.
∙ Elaboração de um aplicativo web, onde o administrador do sistema possa gerenciar
acessos individuais ao terminal.
27
∙ Elaboração de um protocolo de segurança para comunicação entre todas as partes
que formam o sistema.
29
2 Embasamento Teórico
2.1 Near Field Communication
O NFC, acrônimo para Near Field Communication, é um conjunto de padrões de
comunicação de rádio entre dois dispositivos a uma curta distancia, geralmente não mais
que alguns centímetros, o que o torna muito recomendado em transações que exigem certo
nível de segurança. (KUMAR, 2011; HASELSTEINER; BREITFUSS, 2006).
Esses padrões foram criados baseados no já existente RFID, acrônimo para Radio
Frequency IDentification. Eles incluem protocolos de comunicação e formatos de dados
definidos pelo Fórum NFC, criado em 2004 por Nokia, Sony e Philips, e hoje já possui mais
de 160 membros, incluindo Samsung, Google, RIM, Microsoft, Intel, Visa, MasterCard e
outros. (NFC - FORUM, 2013a)
2.1.1 Histórico
A história do NFC começa em 1983, em suas raízes, com o surgimento do RFID1 .
O NFC pode ser visto como uma aplicação restrita do RFID, com padrões e especificações
bem definidos e com o alcance diminuído, por motívos de segurança.
Já em 2004, vista a necessidade da criação e atualização desses padrões e especificações, foi criado o Fórum NFC. Depois disso logo começaram a surgir os primeiros
celulares possuidores dessa tecnologia, começando com o Nokia 6131.
Em 2009 foi criada uma nova forma de comunicação baseada nessa tecnologia,
o ‘peer-to-peer’, e logo em seguida surgiu o primeiro Android com capacidade NFC, O
Galaxy Nexus2 . O uso do NFC só aumentou desde então com o surgimento de Smart
Tags e dos métodos de pagamento utilizando celular.
Nesse ano, Samsung e VISA anunciaram uma parceria para desenvolvimento de
métodos de pagamento via celular (MAJOR. . . , 2013), o que promete aumentar o número
de dispositivos com chip NFC embutido.
2.1.2 Funcionamento
Existem basicamente três formas de comunicação NFC: (KUMAR, 2011)
1
2
Radio-Frequency Identification, permite que ondas de rádio sejam emitidas para um dispositivo passivo
para identificação e autenticação.
Surgido de uma parceria entre Samsung e Google (desenvolvedora do sistema operacional de código
aberto Android).
30
Capítulo 2. Embasamento Teórico
∙ Emulação de cartão: Onde um dispositivo se passa por uma tag ou cartão NFC
passivo para responder a um pedido de um iniciador ativo.
∙ Leitura e Gravação de cartão: Onde um iniciador pode ler ou gravar alguma informação em um dispositivo passivo.
∙ Peer to peer: Onde dois dispositivos NFC ativos se comunicam entre si.
Neste trabalho focou-se no uso da comunicação peer-to-peer uma vez que alguns
dos sistemas operacionais móveis que suportam NFC (incluindo o Android) não permitem
o modo de Emulação de Cartão.
Para explicar seu funcionamento, as seguintes sessões fazem um paralelo entre as
camadas do NFC e as do Modelo OSI. Apenas 3 camadas do modelo OSI são relevantes,
a camada física, a camada de enlace de dados e a camada de aplicação. Como é mostrado
na figura 3.
Figura 3: Comparação entre o Modelo OSI e o NFC
2.1.2.1 Camada Física (Hardware)
O NFC funciona usando a indução magnética. O iniciador emite uma pequena
corrente elétrica em sua antena, esta, cria um campo magnético que ocupa o espaço entre
o iniciador e o alvo. Esse campo é recebido por uma bobina na antena do dispositivo,
onde é convertido novamente para sinais elétricos para que seja possível a comunicação
de dados. O esquema dessa comunicação pode ser visto na figura 4.
2.1. Near Field Communication
31
Caso o alvo seja um dispositivo passivo3 ele usa a própria corrente que foi induzida
pelo iniciador para se alimentar, responder e enviar alguma informação. Casa seja ativo,
ele utiliza sua própria alimentação para responder ao iniciador.
Figura 4: Funcionamento do NFC.
Fonte: http://www.antenna-theory.com
Modulação e transferência de Dados
A modulação consiste em modificar as características de uma onda para transferir
informação. Essa onda é chamada de portadora.
Um exemplo de modulação pode ser visto na figura 5. A modulação OOK (on-off
key) consiste em um período de duração fixa onde o sinal está em 1 (HIGH) ou 0 (LOW).
Utilizando uma modulação digital como essa, a demodulação pode ser feita facilmente com o uso de um diodo e um capacitor. Também é implementado um extrator de
clock do sinal, para ser utilizado nos blocos lógicos do circuito. (NFC - FORUM, 2013b).
Figura 5: Representação da modulação Digital OOK.
Fonte: http://www.eetimes.com/
No NFC, o sinal é enviado modulando-se digitalmente uma portadora de 13.56MHz,
mas como ele pode ser aplicado em comunicações passivas, o sinal enviado é usado para
3
São chamados dispositivos passivos aqueles que não possuem uma própria fonte de alimentação, pode
ser um cartão ou Tag NFC.
32
Capítulo 2. Embasamento Teórico
alimentar o dispositivo, dessa forma a modulação OOK se torna inviável para uma mensagem com muitos ’zeros’ em sequência, então outros modelos mais complexos são utilizados
(NFC - FORUM, 2013b).
2.1.2.2 Camada de enlace de Dados
A camada de enlace de dados (segunda camada do modelo OSI) do NFC para
comunicações peer to peer é definida pelo NFC Fórum através da especificação técnica do
LLCP (Logical Link Control Protocol). Podemos citar como principais aspectos do LLCP:
(NFC - FORUM, 2011)
∙ Define como dois dispositivos dentro do alcance podem reconhecer implementações
compatíveis de LLCP, estabelecer a conexão e desativar quando for necessário.
∙ Define o MAC (Media Access Control) com o objetivo de evitar colisão de dados.
Tipicamente, dois dispositivos NFC em modo peer to peer, operam de forma que
um deles seja o mestre, chamado Initiator, que é capaz de enviar e requisitar dados
para o escravo, chamado target.
∙ O LLCP não provê nenhum tipo de segurança entre os dois pontos, a segurança
deve ser implementada nas outras camadas.
∙ É capaz de acomodar inúmeros protocolos de nível maior ao mesmo tempo.
Sua arquitetura pode ser vista na figura 6.
A LLCP define, como unidade básica, a structure PDU (Payload Data Unit), além
de seus tipos e usos. A próxima seção fala um pouco sobre os PDUs.
PDU
O formato de um PDU é constituído de um cabeçalho, que pode conter dois ou
três bytes, e do payload. O formato é mostrado na figura 7.
Os elementos que constituem um PDU são:
∙ Dois campos de endereço (cada um com 6 bits), DSAP (Destination Service Access
Point) e SSAP (Source Service Access Point). O DSAP deve informar o serviço do
ponto de acesso para qual a informação foi transmitida. O SSAP deve informar o
Serviço do ponto de acesso onde essa informação foi originada.
∙ Um campo de Tipo do PDU com tamanho de 4 bits. Esse campo deve identificar a
sintaxe e a semântica utilizada nos outros campos do PDU e deve ter um dos valores
2.1. Near Field Communication
33
Figura 6: Representação da arquitetura da LLCP.
Fonte: http://www.nfc-forum.org/
Figura 7: Representação de um PDU.
Fonte: http://www.nfc-forum.org/
especificados pelo NFC-Fórum. Para contexto desse trabalho, apenas comentaremos
sobre alguns desses tipos.
∙ Um capo de sequência formado por 0 ou 1 bytes, está presente apenas em alguns
tipos de PDU. O campo de sequência, quando presente, está dividido em 4 bits
para sequência de envio (nos bits mais significantes), e 4 bits para a sequência de
recepção (nos 4 bits menos significantes).
∙ Um campo de informação formado por 0 ou N bytes, o tamanho desse campo depende do tipo de PDU e o máximo valor de N depende do serviço que receberá a
informação.
34
Capítulo 2. Embasamento Teórico
Tipos de PDU
Serão comentados apenas alguns tipos de PDU’s, os mais relevantes para o contexto
deste trabalho.
∙ PDU tipo PAX
O PDU tipo PAX é usado para trocas de parâmetros no que diz respeito à configuração do enlace LLCP. O parâmetro de sequência não é usado para esse tipo de PDU
e o campo de informação deve conter os parâmetros de configuração. O formato
para os parâmetros de configuração se encontram fora do contexto desse trabalho.
Para um PDU tipo PAX, os dois campos de endereço devem ser 0, o formato de um
PDU tipo PAX é visto na tabela 1.
Tabela 1: Formato para um PDU tipo PAX
DSAP
PTYPE
SSAP
INFORMAÇÂO
000000
0001
000000
Lista de parâmetros
∙ PDU tipo CONNECT
O PDU tipo Connect é usado para solicitação de uma conexão. Ele deve conter
ambos os campos de endereço e pode conter o campo de informações para parâmetros
de conexão. O formato para esses não se encontram no contexto deste trabalho. O
formato para um PDU do tipo connect pode ser visto na tabela 2:
Tabela 2: Formato para um PDU tipo CONNECT
DSAP
PTYPE
SSAP
INFORMAÇÃO
DDDDDD
0100
SSSSSS
Lista de parâmetros (opcional)
∙ PDU tipo DISC
O PDU tipo DISC (Disconnect) Serve para terminar uma conexão, ele não deve
possuir o octeto de sequencia nem os bytes de informação. O formato é mostrado
na tabela 3.
Tabela 3: Formato para um PDU tipo DISC
DSAP
PTYPE
SSAP
DDDDDD
0101
SSSSSS
∙ PDU tipo I
O PDU do tipo I (Information) é usado para transferir dados pelo enlace LLCP.
Ele deve possuir os bits de sequência e os bytes de informação. O formato pode ser
visto na tabela 4.
2.1. Near Field Communication
35
Tabela 4: Formato para um PDU tipo I
DSAP
PTYPE
SSAP
DDDDDD
1100
SSSSSS
Sequência
Seq. envio
INFORMAÇÃO
Seq. recebimento
Dados
∙ PDU tipo SYMM
O PDU do tipo SYMM (Symmetry) esse tipo de PDU é usado pela LLCP para
quando nenhum outro PDU está disponível para ser mandado, apenas para garantir
a simetria do protocolo. Pode-se ver o formato na tabela 5.
Tabela 5: Formato para um PDU tipo I
DSAP
PTYPE
SSAP
DDDDDD
1100
SSSSSS
Sequência
Seq. envio
INFORMAÇÃO
Seq. recebimento
Dados
2.1.2.3 Camada de Aplicação
No nível da aplicação, um dos protocolos utilizados para troca de unidades de
dado pelo NFC é o SNEP (Simple NDEF Data Exchange). Esses dados são enviados
no formato de menssagens NDEF (NFC Data Exchange Format). Esses tópicos serão
discutidos com mais profundidades nas subseções seguintes.
Outros protocolos utilizados para comunicação via NFC peer-to-peer não serão
abordados nem mencionados no contexto desse trabalho.
Protocolo SNEP
O SNEP (NFC - FORUM, 2013c) é um protocolo de solicitação e resposta (request/response) onde o cliente faz uma solicitação ao servidor e espera uma resposta. Caso
o tamanho de uma solicitação ou uma resposta seja maior que o máximo possível para o
protocolo inferior, no caso, o LLCP mencionado na seção anterior, ela deve ser dividida
em fragmentos. A figura 8 mostra um exemplo de comunicação baseado no protocolo
SNEP.
Uma solicitação SNEP tem o formato mostrado na tabela 6 e a resposta possui o
formato especificado na tabela 7.
Tabela 6: Formato de uma solicitação SNEP
Cabeçalho SNEP
Versão Solicitação Tamanho
1 byte
1 byte
4 bytes
Carga útil
Tamanho especificado
O significado dos campos vistos nas tabelas 6 e 7 é:
36
Capítulo 2. Embasamento Teórico
Figura 8: Representação de uma comunicação utilizando o protocolo SNEP.
Fonte: http://www.nfc-forum.org/
Tabela 7: Formato de uma resposta SNEP
Cabeçalho SNEP
Versão Resposta Tamanho
1 byte
1 byte
4 bytes
Carga útil
Tamanho especificado
∙ Versão indica o formato da mensagem que está sendo enviada e a capacidade do
dispositivo que a enviou de entender comunicações futuras. É formado 2 números
inteiros de 4 bits, o primeiro para a maior versão e o segundo para menor versão
aceita.
∙ Solicitação indica a ação que deve ser executada no servidor, a tabela 8 mostra os
tipos de comandos aceitos.
∙ Resposta indica o resultado da ação solicitada ao servidor. A tabela 9 mostra os
comandos utilizados como resposta.
∙ Tamanho são 4 bytes que indicam o tamanho da carga útil, são utilizados 4 bytes,
o que indica que o máximo tamanho de uma mensagem NDEF é FFFFFFFFh isso
é, 232 − 1 bytes.
2.1. Near Field Communication
37
∙ Carga útil é a parte da mensagem onde vai a mensagem NDEF, a ser discutida um
pouco mais a frente
Tabela 8: Comandos de solicitação
Código
00h
Comando
Continue
01h
Get
02h
Put
7Fh
Reject
Descrição
Continuar enviando os próximos fragmentos da mensagem (esse comando não
será importante no contexto deste trabalho).
Requisita do servidor uma
mensagem NDEF de resposta deve conter na carga
útil o tamanho máximo da
mensagem a ser recebida e
uma mensagem NDEF que
identifica o tipo de mensagem a ser recebida.
Solicita que o servidor
aceite uma mensagem
NDEF que é enviada na
carga útil.
Solicita que o servidor não
envie os próximos fragmentos da mensagem.
Formato NDEF
O NDEF (NFC - FORUM, 2006) é o formato que define a forma como uma mensagem será encapsulada para transferência, ele pode ser usado tanto para tags passivas
quanto para dispositivos ativos4 . Para explicar como funciona uma mensagem NDEF
serão usadas as seguintes definições:
∙ Mensagem NDEF: Composta por uma ou mais gravações NFC.
∙ Gravação NDEF: Mensagem a ser transmitida, formada basicamente por um
cabeçalho e uma ‘carga útil’.
∙ Cabeçalho: Composto de um identificador, o tamanho da carga útil e o tipo da
carga útil.
∙ Carga Útil: Dados que se deseja transmitir.
4
Existem vários outros formatos de dados ultilizados. Como o NDEF é largamente utilizado pela
maioria dos sistemas operacionais móveis graças a escolha do protocolo SNEP para a grande parte
das aplicações NFC, esse trabalho se limitará a esse formato
38
Capítulo 2. Embasamento Teórico
Tabela 9: Comandos de Resposta
Código
80h
Comando
Continue
81h
Success
C0h - C2h
Erro
E0h - E1h
Não Suportado
Descrição
Continuar enviando os próximos fragmentos da mensagem (esse comando não
será importante no contexto desse trabalho).
Requisita do servidor uma
mensagem NDEF de resposta deve conter na carga
útil o tamanho máximo da
mensagem a ser recebida e
uma mensagem NDEF que
identifica o tipo de mensagem a ser recebida.
Códigos para alguns tipos
de erro, como mensagem
mal formulada ou excesso
de dados
Indica que a versão ou o
tipo de solicitação não é
suportado.
A figura 9 mostra o encapsulamento de uma mensagem NDEF.
Figura 9: Mensagem NDEF.
Fonte: http://www.developer.nokia.com
O identificador de uma mensagem NDEF tem seu formato mostrado na tabela 10
∙ MB (Message Begining): Se for 1 indica que essa é a primeira gravação na
mensagem.
2.2. O sistema operacional Android
39
Tabela 10: Formato do Identificador de uma Gravação NDEF
MB
ME
CF
SR
IL
TNF
∙ ME (Message End): Se for 1 indica que essa é a ultima gravação da mensagem.
∙ CF (Chunck Record): Indica que essa é uma gravação incompleta e apenas parte
da carga útil está presente.
∙ SR (Short Record): Caso esteja em 1, indica que essa é uma gravação pequena
e o campo Tamanho possui apenas um byte.
∙ IL (ID Length:) Indica que existe um octeto para o tamanho do ID e um campo
para o ID da gravação do tamanho indicado.
∙ TNF (Type Name Format): Indica o formato do campo tipo.
2.2 O sistema operacional Android
O Android (ANDROID. . . , 2013) é um sistema operacional baseado em Linux
e desenvolvido primariamente para dispositivos móveis com touchscreen, como tablets e
celulares. Ele foi desenvolvido primeiramente pela Android Inc., que em 2005 foi comprada
pela Google. O Android é open-source e o código é disponibilizado pela Google sob a
licença Apache. (ANDROID. . . , 2013).
O fato de ter código aberto o tornou muito popular entre os desenvolvedores e,
segundo o site visionmobile (DEVELOPER. . . , 2013), é utilizado por 71% dos desenvolvedores de aplicativos móveis.
Esses fatores contribuíram bastante para tornar o Android a plataforma móvel
mais utilizada no mundo. Segundo o site IDC (IDC. . . , 2013), no segundo trimestre de
2013, o android possuía 79,3 % de Market Share.
2.2.1 Aplicativos Android
Os aplicativos desenvolvidos para Android são escritos em linguagem JAVA utilizando o Android SDK, que inclui uma ferramenta de Debug, bibliotecas e um emulador.
A maior parte dos aplicativos desenvolvidos são lançados na Google Play, a loja
de aplicativos da Google, mas o sistema permite que um usuário baixe, instale e utilize
aplicativos por outros meios. (ANDROID. . . , 2013)
40
Capítulo 2. Embasamento Teórico
2.2.2 Android e NFC
O sistema operacional Android possui sua própria biblioteca para que desenvolvedores consigam usar os recursos NFC do celular. Por motivos de segurança, não é
permitido operá-lo em baixo nível.
As primeiras versões do Android apenas suportavam o modo de leitura e escrita
para NFC, o modo de emulação de cartão ainda não foi disponibilizado para o público e o
modo peer-to-peer é disponibilizado apenas através do Android Beam𝑇 𝑀 (ANDROID. . . ,
2013) que será discutido na próxima subseção.
2.2.2.1 Android Beam𝑇 𝑀
Essa é uma maneira simples para transmitir mensagens através do NFC entre dois
dispositivos. O Beam𝑇 𝑀 foi criado para fazer troca de pequenas informações entre dois
dispositivos Android apenas tocando um no outro, e isso acarreta algumas limitações que
são tratadas como restrições de projeto: (ANDROID. . . , 2013)
∙ A aplicação que está enviando uma mensagem deve estar em foreground, aberta e
visível para o usuário.
∙ Os dados enviados devem ser encapsulados em uma mensagem NDEF. O Beam𝑇 𝑀
apenas suporta SNEP sobre LLCP.
∙ Uma mensagem só pode ser enviada com a autorização do usuário. Isso é feito
através de uma tela com a mensagem: "Toque para transferir". Ela pode ser vista
na figura 10. No momento não é possível enviar dados via NFC sem que o usuário
toque a tela em confirmação.
2.2.2.2 Dispositivos com chip NFC
Com o crescimento do NFC, muitos celulares android possuem chip NFC embutidos. A google anunciou durante o evento "Google I/O"desse ano, que cerca de 1 milhão de
dispositivos Android com essa funcionalidade são ativados a cada semana. Esses números
tendem apenas a crescer, segundo a STRATEGY ANALITICS, no final de 2013 serão em
torno de 400 milhões de smartphones com NFC (cerca de um terço).
2.3. Segurança e criptografia
41
Figura 10: Tela de confirmação de envio de dados do Android Beam
2.3 Segurança e criptografia
Um ponto importante para um projeto que envolve o gerenciamento de dados de
um cliente, é assegurar de que esses dados não possam ser lidos ou usados por intrusos.
Um programa deve garantir que a informação seja armazenada, transmitida e
recebida de forma segura. Nessa sessão foi feito um apanhado de informações sobre
inúmeros métodos de segurança no armazenamento e na comunicação.
2.3.1 Métodos de criptografia
A criptografia tradicional consiste em um método de transmissão de dados em que
as mensagens a serem enviadas, aqui será chamado de texto simples, são transformadas
em uma mensagem ilegível, aqui chamada de texto criptografado.
Durante o processo de comunicação a mensagem criptografada é enviada para o
destinatário, este, conhecendo o método de decriptografia pode transformá-la em texto
simples novamente. (SCHNEIER, 1996).
A figura 11 mostra como funciona o modelo clássico de criptografia. Para que este
funcione, deve-se supor que o destinatário conhece o método de decriptografia. Dessa
forma, porem, ele deve ser mudado sempre que for comprometido, uma vez que um intruso
42
Capítulo 2. Embasamento Teórico
Figura 11: O modelo de criptografia
também possa conhecê-lo. Para evitar tal esforço, usa-se uma chave de criptografia, que
nada mais é que uma string usada para parametrizar o método. Dessa forma, precisa-se
de uma chave sigilosa e um método público.
Visto que os métodos de criptografia e decriptografia são apenas funções matemáticas onde a chave e o texto são parâmetros, será usada uma notação similar àquelas
sugeridas por Tanenbaum (1997) e Schneier (1996), onde:
∙ 𝐶: Texto cifrado.
∙ 𝑆: Texto simples.
∙ 𝐸𝑘 : Método de criptografia usando a chave k.
∙ 𝐷𝑘 : Método de decriptografia usando a chave k.
Dessa forma pode-se escrever:
𝐶 = 𝐸𝑘 (𝑆)
(2.1)
𝑆 = 𝐷𝑘 (𝐶)
(2.2)
e
O que significa que a encriptação da mensagem 𝑆, usando a chave 𝑘 tem como
resultado 𝐶 e, da mesma forma, 𝐶 decriptado com utilização da chave 𝑘 resulta em 𝑆.
As equações também sugerem:
𝑆 = 𝐷𝑘 (𝐸𝑘 (𝑆))
(2.3)
2.3. Segurança e criptografia
43
É claro que esse método depende de um meio seguro por onde a chave encriptação
possa ser transmitida. Uma maneira de evitar isso é utilizar um método de chave pública
ou um método seguro de de compartilhamento de chaves secretas.
2.3.1.1 Método DES
O método de encriptação Data Encryption Format (DES) é usado largamente em
informática. Segundo Wayner (1995), ele já não é mais segura quando usada da mesma
forma que foi criada, porém, modificado, ainda é bastante útil.
Segundo Tanenbaum (1997), o DES funciona dividindo o texto simples em blocos
de 64 bits que passam por 19 estágios distintos parametrizados por uma chave de 56 bits.
O primeiro estágio é uma transposição de chave independente5 no texto simples
𝑆. No último estágio é feita a mesma transposição de forma invertida. No penúltimo
estágio é feito um SWAP de 32 bits6 . Nos estágios intermediários divide-se o bloco de 64
bits em dois blocos de 32 bits, que serviram como entrada. Será utilizado 𝐷𝑖𝑛 e 𝐸𝑖𝑛 para
denotar as entradas e 𝐷𝑜𝑢𝑡 e 𝐸𝑜𝑢𝑡 para denotar as saídas. Esse método foi criado para que
a mesma chave de criptografia possa ser usada para decriptografia.
As equações de cada método intermediário são:
𝐸𝑜𝑢𝑡 = 𝐷𝑖𝑛
(2.4)
𝐷𝑜𝑢𝑡 = 𝐸𝑖𝑛 ⊕ 𝐹𝑘𝑖 (𝐷𝑖𝑛 )
(2.5)
e
A figura 12 mostra como funciona cada estágio intermediário.
A complexidade do algoritmo consiste na complexidade da função 𝐹 , que não será
explicada com detalhes, mas consiste em uma expansão de 𝐷𝑖𝑛 para 48 bits, uma operação
OU EXCLUSIVO bit a bit com 𝑘𝑖 e um processo complexo transforma a saída em 32 bits
novamente.
Em cada um desses estágios, uma chave diferente é utilizada. Antes do início do
algoritmo uma transposição é aplicada a chave e logo depois esta é particionada em duas
unidade de 28 bits. Essas unidade são roteadas para esquerda ou direita um certo número
de bits de acordo com o estágio. Em cada estágio é usado um subconjunto de 48 bits para
𝑘𝑖 .
5
6
Método onde os bits da mensagem são colocados em ordem diferente segundo imposto pela chave
Método onde se troca os 32 bits da esquerda com os 32 bits da direita
44
Capítulo 2. Embasamento Teórico
Figura 12: Estágios intermediários do DES
O método DES é mais utilizado hoje em dia em suas variações, uma delas é o
processo de tripla criptografia com duas chaves, onde:
𝐶 = 𝐸𝑘1 (𝐷𝑘2 (𝐸𝑘1 (𝑆)))
(2.6)
𝑆 = 𝐷𝑘1 (𝐸𝑘2 (𝐷𝑘1 (𝐶)))
(2.7)
e
(TANENBAUM, 1997)
Pode-se observar que apesar da tripla criptografia apenas duas chaves são utilizadas, o uso de uma terceira chave seria um grande exagero uma vez que os 112 bits das
duas chaves são suficientes para garantir a segurança.
Alem disso, pode ser visto que o processo de criptografia envolve uma decriptografia com uma segunda chave7 , um bom motivo para isso a retrocompatibilidade (Schneier,
1996). Apenas definindo 𝑘1 = 𝑘2 um computador que usa criptografia tripla pode se
comunicar com um que usa a simples, uma vez que:
𝐸𝑘1 (𝑆) = 𝐸𝑘1 (𝐷𝑘1 (𝐸𝑘1 (𝑆)))
(2.8)
2.3.1.2 Método de compartilhamento de Chave de Diffie-Hellman
Um problema dos métodos de chave única é como estabelecê-la de forma segura
entre remetente e destinatário. O método de troca de Chave de Diffie-Hellman (DIFFIE;
HELLMAN, 1976) resolve esse problema.
7
Chama-se: DES no modo EDE.
2.3. Segurança e criptografia
45
Considere que 𝐴 e 𝐵 precisem estabelecer uma chave secreta para uma comunicação segura. Primeiro escolhe-se 2 números primos extensos, 𝑛 e 𝑔, de forma que (𝑛 − 1)/2
e (𝑔 − 1)/2 também sejam primos. Esses números são públicos e podem ser informados
abertamente sem comprometimento da segurança. 𝐴 deve selecionar um número extenso,
𝑎, que deve ser mantido em segredo. B seleciona um segundo número, 𝑏, da mesma forma.
𝐴 envia uma mensagem para 𝐵 contendo (𝑔 𝑎 mod 𝑛) e 𝐵 envia uma mensagem
contendo (𝑔 𝑏 mod 𝑛). 𝐴 pode calcular: (𝑔 𝑏 mod 𝑛)𝑎 e b pode calcular: (𝑔 𝑎 mod 𝑛)𝑏 .
Como:
(𝑔 𝑎 mod 𝑛)𝑏 = 𝑔 𝑎𝑏 mod 𝑛 = (𝑔 𝑏 mod 𝑛)𝑎
Dessa forma 𝐴 e 𝐵 possuem uma chave secreta compartilhada (𝑔 𝑎𝑏 mod 𝑛). Mesmo
que uma intrusa intercepte todas as mensagens, ela consegue os valores de: 𝑔, 𝑛, (𝑔 𝑏 mod 𝑛),
(𝑔 𝑎 mod 𝑛). Mas mesmo com esses dados, não é possível calcular os valores de 𝑎, 𝑏 ou
(𝑔 𝑎𝑏 mod 𝑛). A figura 13 mostra a comunicação entre 𝐴 e 𝐵
Figura 13: Método de troca de chave de Diffie-Hellman
Um problema desse método é um tipo de ataque chamado man in the middle, que
envolve um intruso ativo. Considerando que um intruso 𝐼 pode interceptar a comunicação
entre 𝐴 e 𝐵, ele pode se passar por um dos dois e enviar mensagens falsas, escolhendo
um número próprio, 𝑖. A figura 14 mostra como funciona esse ataque. Dessa forma 𝐼
pode calcular: (𝑔 𝑎𝑖 mod 𝑛) e (𝑔 𝑏𝑖 mod 𝑛), as mesmas chaves que 𝐴 e 𝐵, respectivamente,
calcularam.
2.3.1.3 Métodos de chave pública
Um dos grandes problemas dos métodos de criptografia mencionados anteriormente
está na distribuição de chaves. Caso um intruso consiga roubar a chave, o sistema se torna
inútil. Diffie e Hellman (1976) propuseram um novo sistema de criptografia onde a chave
usada para criptografar é diferente da chave usada para decriptografar. Nesse sistema
46
Capítulo 2. Embasamento Teórico
Figura 14: Ataque Man In The Middle
deve-se garantir que é extremamente difícil de deduzir uma das chaves conhecendo a
segunda.
Esse método funciona da seguinte maneira. Considerando a comunicação entre
𝐴 e 𝐵, 𝐴 cria uma chave de criptografia e uma de decriptografia, 𝑘𝑒 e 𝑘𝑑 respectivamente. A chave 𝑘𝑑 se torna pública (chave pública) enquanto 𝑘𝑒 é mantida em segredo
(chave privada), os métodos de criptografia e decriptografia, 𝐸 e 𝐷, também são tornados
públicos.
Qualquer um interessado em se comunicar seguramente com 𝐴, 𝐵, por exemplo,
usa a chave pública e o método de encriptação para gerar uma mensagem cifrada:
𝐶 = 𝐸𝑘𝑒 (𝑇 )
(2.9)
Assim qualquer um que interceptar a comunicação saberá 𝐶 e 𝑘𝑒 , mas a partir
disso é impossível determinar 𝑇 . Uma vez que apenas 𝐴 possui a chave para decriptar.
Quando a mensagem chega até 𝐴, precisa-se fazer:
𝑇 = 𝐷𝑘𝑑 (𝐶)
(2.10)
Algoritmo RSA
O algoritmo RSA foi proposto por um grupo de pesquisadores do MIT e é baseado
na teoria dos números. Seu nome é dado pela inicial dos três matemáticos que o criaram,
Rivest, Shamir e Adleman.
A forma resumida do funcionamento do método é, segundo Rivest e Adleman
(1978):
∙ Escolhe-se dois números primos bastante extensos (em geral maior que 10100 ), 𝑝 e 𝑞
por exemplo.
2.3. Segurança e criptografia
47
∙ Calcula-se 𝑛 = 𝑝 × 𝑞 e 𝑧 = (𝑝 − 1) × (𝑞 − 1).
∙ Escolhe-se um número 𝑑 onde 𝑑 e 𝑧 são primos entre si8 .
∙ Calcula-se 𝑒 onde 𝑒 × 𝑑 = 1 mod 𝑧
∙ Divide-se o texto simples em blocos de modo que cada mensagem, 𝑆, fique no
intervalo: 0 ≤ 𝑆 ≤ 𝑛.
∙ Para criptografar a mensagem calcula-se 𝐶 = 𝑃 𝑒 ( mod 𝑛).
∙ Para decriptografar a mensagem calcula-se 𝑃 = 𝐶 𝑑 ( mod 𝑛).
Pelo método pode-se perceber que para criptografia precisa-se do par (𝑒, 𝑛) (chave
pública) e para decriptografia do par (𝑑, 𝑛) (chave privada).
A segurança do método está baseda na dificuldade de se fatorar números bastante extensos. Caso consiga-se fatorar o número publicamente conhecido 𝑛, poderia-se
descobrir os valores de 𝑝, 𝑞, 𝑧 e consequentemente 𝑑.
Porém, considerando um tempo de 1𝜇𝑠 por instrução, o melhor dos algoritmos
levaria 4 bilhões de anos para fatorar um número de 200 dígitos e 1025 anos para um de
500 dígitos. (RIVEST; ADLEMAN, 1978)
O RSA é muito utilizado para distribuir chaves de sessões únicas, dados muito
grandes são geralmente encriptados com o DES, uma vez que o RSA é muito lento para
essa função.
2.3.1.4 Algorítmos de HASH criptográficos
Uma função de hash deve receber um vetor de bytes de tamanho arbitrário e
retornar um segundo vetor de tamanho fixo de forma que qualquer mudança nos dados
vai, com grande probabilidade, modificar o valor de saida, chamado de hash ou digest.
Segundo Tanenbaum (1997), uma função de hash criptográfico ideal, deve possuir
as seguintes propriedades:
∙ É computacionalmente fácil computar o valor de hash de qualquer mensagem.
∙ É computacionalmente intratável gerar uma mensagem sabendo seu valor de hash.
∙ É computacionalmente intratável encontrar duas mensagens com o mesmo hash.
Essa propriedade é chamada de resistência a colisão.
8
chama-se primos entre si dois números que não possuem um divisor comum além de 1
48
Capítulo 2. Embasamento Teórico
Algoritmos de hash são utilizados tanto para verificação de senhas do usuário
quanto para assinaturas digitais e MACs (Message Autentication Code).(BELLARE; KILIAN; ROGAWAY, 2000)
Os métodos de hash criptográficos mais utilizados são o MD5 (RIVEST et al.,
1992) e o SHA (STANDARD, 1993).
2.3.2 Autenticação
A autenticação é o processo de verificar a veracidade de um dado ou informação.
Isso, em geral, envolve confirmar a identidade de uma pessoa ou software. Em muitas
aplicações, garantir que uma informação é autentica é mais importante que o próprio
sigilo da informação. (TANENBAUM, 1997).
Não se deve confundir autenticação e autorização, apesar de estarem relacionados,
o primeiro consiste no processo de verificar a identidade de uma pessoa enquanto o segundo
verifica permissões que uma identidade tem de executar uma ação.
Sistemas que envolvem controle de acesso são exemplos de sistemas que necessitam
de mecanismos com ambas as funções.
Nesta seção, será mostrado dois métodos que podem ser utilizados para garantir
a autenticação de um dispositivo ou mensagem digital.
2.3.2.1 Autenticação baseada em chave compartilhada
Considerando que A e B já possuem uma chave compartilhada (𝑘𝐴𝐵 ), uma forma
de garantir a autenticidade em uma comunicação é através do método de desafio/resposta,
que funciona da seguinte forma: A gera uma sequencia de números (𝑅𝐴 ) aleatórios e envia
para B, B usa a chave compartilhada e gera 𝐸𝑘𝐴𝐵 (𝑅𝐴 ). B envia o resultado da encriptação
para A, que compara com a sua própria encriptação. A sabe que um invasor não poderia
ter encriptado corretamente 𝑅𝐴 pois apenas B conhece a chave secreta 𝑘𝐴𝐵 . Esse método
pode ser visto na figura 15. (TANENBAUM, 1997)
2.3.2.2 Autenticador de uma mensagem
Uma segunda maneira de garantir autenticação é através de um autenticador, que é
conhecido como MAC (Message Autentication Code) (BELLARE; KILIAN; ROGAWAY,
2000).
O MAC é uma pequeno pedaço de informação que é utilizado para autenticar uma
mensagem. Ele recebe como entrada uma chave e a mensagem, que deve ser autenticada,
e retorna o MAC, que nada mais é que uma encriptação de uma função HASH.
2.3. Segurança e criptografia
49
Figura 15: Método de autenticação baseado em chave compartilhada
Ele se diferencia dos outros métodos de assinaturas digitais uma vez que utiliza
encriptação simétrica, e não de chave privada.
O MAC parte da hipótese de que as duas partes que necessitam da autenticação
já compartilham uma chave secreta. Caso essa chave seja comprometida, todo o processo
de autenticação pode se tornar inválido. (TANENBAUM, 1997)
51
3 Metodologia e Implementação
3.1 Descrição do Projeto
O projeto consiste em um terminal desenvolvido com utilização da plataforma
Arduino, com capacidade NFC adicionada, que controla uma fechadura elétrica. Esse
terminal deve ser capaz de se comunicar com um celular, que também deve ter capacidades
NFC, rodando um aplicativo desenvolvido para o sistema operacional Android.
O projeto também prevê a utilização de um aplicativo web para gerenciamento e
administração de acesso.
Um diagrama esquemático das interações entre os componentes do sistema pode
ser visto na figura 16. Uma explicação mais detalhada do processo envolvido será incluída
nas próximas seções.
Figura 16: Diagrama esquemático
O desenvolvimento e implementação do sistema possuiu 4 etapas:
∙ Desenvolvimento e montagem do hardware.
∙ Desenvolvimento do software para a fechadura.
∙ Desenvolvimento do aplicativo para android.
∙ Desenvolvimento da aplicação Web.
52
Capítulo 3. Metodologia e Implementação
Cada uma dessas etapas será abordada de forma mais detalhada nas seções seguintes.
3.1.1 Especificação de Requisitos do Projeto
Serão utilizadas as seguintes definições para os STAKEHOLDERS:
Desenvolvedor Responsável pela elaboração da solução técnica.
Cliente Pessoa ou empresa que contrata o serviço para ser usado em um cofre ou portas.
Usuário Aquele que utiliza o serviço, usando seu celular para abrir uma fechadura.
Também serão usadas as seguintes definições:
Terminal Hardware encontrado na fechadura.
Aplicativo móvel Software desenvolvido para Android.
Aplicativo WEB ou Servidor Site desenvolvido na para acesso WEB.
Sistema Conjunto de todo sistema composto por terminal aplicativo móvel e aplicativo
WEB.
3.1.1.1 Requisitos Não-funcionais
∙ A comunicação entre o Aplicativo móvel e o Terminal deve ser feita de forma
segura com criptografia RSA, DES ou AES(FIPS, 2001) e autenticação.
∙ O Desenvolvedor deve prever atualizações periódicas para suprir a necessidade de
segurança do sistema.
∙ Todos os dados dos Usuários e do Cliente devem ser gravados de forma criptografada e segura, através de uma função Hashing.
∙ O tempo entre o envio da mensagem pelo Aplicativo móvel e a abertura da porta
dever ser o menor possível (< 5𝑠).
∙ O usuário deve conseguir acesso com o mínimo de configuração possível e o mínimo
de toques na tela.
∙ Apenas uma mensagem deve ser enviada pelo Aplicativo móvel para o Terminal
a fim de cumprir os requisitos dos dois itens anteriores.
∙ O sistema deve gravar um LOG de acesso à fechadura, relatando quais Usuários a
utilizaram.
3.2. Hardware para a fechadura
53
∙ O Cliente deve ser capaz de, a qualquer momento, verificar o LOG de acesso.
∙ A interface do aplicativo deve ser limpa e desenvolvida utilizando o método KISS
Keep It Symple, Stupid.
∙ O aplicativo móvel deve rodar em Android versão 4.0 (Ice Cream Sandwish) e
mais novas.
∙ O aplicativo móvel deve ser atualizado automaticamente quando necessário, seja
via Google Play ou por um sistema customizado do Desenvolvedor (sem necessidade de intervenção do Usuário ou Cliente).
∙ O aplicativo web deve ser implementado com utilização do HTTPs.
∙ O sistema deve implementar um time-out para a autorização de um usuário.
Obs. A segurança do meio físico não faz parte deste projeto de TCC.
3.1.1.2 Requisitos Funcionais
∙ O terminal deve controlar um Relê para acionar uma fechadura elétrica alimentada
com 12V.
∙ O terminal deve ser capaz de se comunicar através do NFC utilizando o modo de
comunicação peer-to-peer.
∙ O Terminal deve ser capaz receber e enviar mensagens por NFC no formato NDEF
com utilização do protocolo SNEP sobre LLCP.
∙ O Cliente deve ser capaz de autorizar ou revogar a autorização de qualquer usuário
para acesso de qualquer terminal a qualquer momento através do Aplicativo WEB.
3.2 Hardware para a fechadura
Para cumprimento dos requisitos funcionais do projeto, precisou-se escolher:
∙ Que tipo de micro-controlador será usado.
∙ Que tipo de relê será utilizado.
∙ Qual hardware será utilizado para incluir a funcionalidade NFC.
As seções seguintes discorrem sobre essas escolhas.
54
Capítulo 3. Metodologia e Implementação
3.2.1 O Arduino
O Arduino é uma plataforma de prototipagem eletrônica baseada em processadores
da ATMEL, que podem variar desde um AVR de 8-bits à um ARM de 32-bits. O Arduino
foi escolhido tanto pela vasta gama de acessórios disponíveis quanto pela quantidade de
informação e bibliotecas disponíveis na internet, já que é um projeto de hardware-livre e
código-aberto.
Durante o desenvolvimento do sistema, foram feitos vários testes de desempenho
das bibliotecas implementadas, por isso utilizou-se 3 Arduinos diferentes, o UNO (figura
17), o MEGA (figura 18) e o DUE 19. Pode-se ver um comparativo de algumas características importantes dos 3 Arduinos na tabela 11.
(a) Arduino R3 UNO (Frente)
(b) Arduino R3 UNO (Costas)
Figura 17: Arduino R3 UNO
Fonte: http://www.arduino.cc/
Figura 18: Arduino MEGA 2560
Fonte: http://www.arduino.cc/
Pode-se ver que o Arduino UNO não possui alto poder de processamento, não
só por possuir clock de apenas 16MHz mas principalmente pela memória RAM limitada,
apenas 2kB. Para um programa que envolve grandes matrizes ou faz uso de muitos objetos
Strings isso se torna um grande problema, uma vez que pode-se facilmente chegar a 2048
caracteres.
3.2. Hardware para a fechadura
55
Figura 19: Arduino DUE
Fonte: http://www.arduino.cc/
Tabela 11: Características dos três Arduinos trabalhados
Microcontrolador
Tensão de Operação
Tensão de entrada
Pinos Digitais (I/O)
Pinos Analógico (I)
Memória Flash
SRAM
EEPROM
Frequência de Clock
Arduino UNO
ATmega328
5V
7-12V
14
6
32 KB
2 KB
1 KB
16 MHz
Arduino DUE
AT91SAM3X8E
3.3V
7-12V
54
12
512 KB
96 KB
84 MHz
Arduino MEGA
ATmega2560
5V
7-12V
54
16
256 KB
8 KB
4 KB
16 MHz
3.2.2 O PN532
O PN532 é um modulo de transmissão para comunicação via RF a 13.56MHz. Ele
inclui a funcionalidade de um microcontrolador com núcleo baseado em um 80C51. Ele
pode se comunicar via UART, I2 C ou SPI.
Esse chip foi escolhido por:
∙ Estar facilmente disponível para o Arduino em forma de Shield 1 . O shield
utilizado para o projeto pode ser visto na figura 20.
∙ Ser largamente utilizado. Vários dos celulares com capacidade NFC possuem
um PN532 imbutido.
∙ Ser capaz de realizar comunicação peer-to-peer. Muitos do chips disponíveis
possuem apenas capacidade de ler e gravar tags NFC passívas. (NXP - PHILIPS,
2007)
1
Periféricos feitos especialmente para o Arduino são chamados de Shields
56
Capítulo 3. Metodologia e Implementação
Figura 20: Shield NFC para o Arduino
3.2.3 Primeiro Protótipo
Para montagem do primeiro protótipo, foi utilizado:
∙ Arduino UNO R3, mostrado na figura 17.
∙ Um Shield NFC PN532 para Arduino, mostrado na figura 20.
∙ Um Shield de prototipação para Arduino, mostrado na figura 21.
∙ Um Relay 5V, mostrado na figura 22.
∙ Um sensor magnético (Reed Switch).
∙ Um auto-falante de placa mãe (Buzzer).
A montagem do primeiro protótipo incluía um Reed Switch para leitura do estado
da porta e um buzzer para envio de mensagens de erro ou sucesso. Tais elementos foram
excluídos do projeto na implementação final.
Projetou-se o primeiro protótipo do terminal segundo o esquemático mostrado no
apêndice A, o resultado da montagem pode ser visto na figura 23.
Para o primeiro protótipo utilizou-se um software que fazia a comunicação via
NFC sem utilização de criptografia. Quando foram inclusos testes com criptografia o
arduino UNO se mostrou muito limitado. Por esse motivo buscou-se a utilização de
microcontroladores com maior capacidade como o Arduino DUE e MEGA.
3.2.4 O protótipo Final
Para montagem do protótipo final, algumas mudanças foram requisitadas:
3.2. Hardware para a fechadura
57
Figura 21: Shield de prototipação para Arduino
Figura 22: Relay 5V
Figura 23: Primeiro Protótipo do Terminal
∙ O hardware deve ser conectorizado de forma a ser compatível com o Arduino MEGA,
DUE e UNO (o MEGA é usado preferencialmente, por ser mais barato que o DUE
58
Capítulo 3. Metodologia e Implementação
e ter a quantidade de RAM necessária, além da compatibilidade de software com o
UNO, já que possuem a mesma arquitetura AVR).
∙ Não será utilizado um shield de prototipação com protoboard, os elementos utilizados devem ser soldados a fim de evitar mal contatos.
∙ Não será incluído o Relay na placa de prototipação. Deve-se utilizar um Relay
de estado sólido. Uma segunda plca deverá ser confeccionada para ele quando for
testado com uma fechadura elétrica real.
∙ Não será incluído, por enquanto, o sensor magnético (Reed Switch). Apenas por
motivo de praticidade uma vez que ele não é uma parte importante do sistema.
∙ Em lugar do buzzer para pequenas comunicações ao usuário, deve-se fazer a utilização de dois LEDs acionados através de transistores.
∙ Para cumprir alguns requisitos de segurança do projeto, deverá ser incluso, na placa
confeccionada, um RTC (Real Time Clock).
Seguindo os requisitos propostos para o protótipo final montou-se uma placa de
prototipação com o proposito de conter o RTC, os leds e acoplar facilmente o shield NFC.
Com o intuito de que ele seja facilmente utilizado em qualquer Arduino2 .
A figura 24 mostra a placa confeccionada, o Shield NFC e o Arduino Mega. Mostra
também os cabos confeccionados para fazer a conexão. A figura 25 mostra a placa já
montada e a figura 26 mostra todo o sistema em estado de funcionamento (aguardando a
aproximação de um celular).
3.3 Software para o Arduino
A implementação do software para o Arduino envolveu duas grande etapas. A
primeira delas foi a criação de uma biblioteca que servisse de interface com o PN532
e implementasse a comunicação peer-to-peer. As bibliotecas disponíveis até o momento
apenas faziam leitura e gravação de tags passivas.
A segunda etapa envolveu a implementação da segurança do sistema. Algumas
bibliotecas deveriam ser desenvolvidas para garantir a segurança.
Como não se tinha certeza da eficiência de qualquer algoritmo que pudesse ser
utilizado, ou como se comportariam nos 3 Arduinos, ou durante a transmissão NFC, a
abordagem utilizada para implementação desses softwares foi a prototipação.
2
Os três Arduinos possuem os pinos da SPI em lugares diferentes, o DUE não possui pinos da SPI
ligados aos conectores que são utilizados pelo shield, a placa possibilita a ligação do shield em qualquer
Arduino
3.3. Software para o Arduino
59
Figura 24: Shield NFC, Placa confeccionada, Arduino MEGA e cabos confeccionados
Figura 25: Placa confeccionada montada
Todos os softwares elaborados para o Arduino foi desenvolvido em C++ e foram
utilizadas duas IDE’s. A primeira, foi a IDE do Arduino, mostrada na figura 27. Por ser
uma IDE bem simples, foi utilizada principalmente para fazer compilação e transferência
do código.
Para criação das bibliotecas, foi utilizada uma IDE muito mais completa, com
muito mais recursos. Uma plataforma de código aberto chamada Code::Blocks (figura
28).
60
Capítulo 3. Metodologia e Implementação
Figura 26: Todo sistema em funcionamento
Figura 27: IDE para o Arduino.
3.3.1 Implementação da Biblioteca para comunicação peer-to-peer NFC
Para implementar a comunicação peer-to-peer a biblioteca criada deveria implementar os protocolos LLCP e SNEP, o formato NDEF e a comunicação com o PN532.
Para isso, foram utilizadas a biblioteca já implementada para o PN532 (biblioteca de
código livre desenvolvida pela ADAFRUIT) e a LIBNFC (biblioteca de código livre desenvolvida pelo NFC-Fórum), utilizada como referência para implementação de alguns
tipos.
3.3.1.1 Comunicação com o PN532
A comunicação com o PN532 é feita através da SPI (NXP - PHILIPS, 2007).
Alguns parâmetros de configuração ainda não ficaram muito claro, mesmo lendo a do-
3.3. Software para o Arduino
61
Figura 28: IDE do Code::Blocks
cumentação do PN532 e da configuração esperada pelo Android. Dessa forma, várias
tentativas precisaram ser feitas.
Nas seções subsequentes, pode-se ver os principais comandos do PN532 que foram
utilizados.
Comando InitAsTarget
O comando Init as Target serve para configurar o PN532 como target. Ao enviar
esse comando, o PN532 apenas responde quando recebe um Atribute Request do Initiator.
O comando InitAsTarget tem a sintaxe mostrada na tabela 12.
Tabela 12: Sintaxe do Comando InitAsTarget
D4
8C
Mode (1byte) MifareParams (6 bytes) FeliCaParams (18 bytes)
NFCID3t (10 bytes) LEN Gt Gt Len Tk Tk
A resposta do comando indica parâmetros para as próximas comunicações, principalmente para os protocolos de anticolisão e outros baseados no NFCIP3 (NFC - FORUM,
2013b), que estão fora do contexto deste trabalho.
Para o contexto deste trabalho, o fator mais importante são os parâmetros FeliCa,
já que o Android sempre envia uma requisição para o padrão FeliCa (SONY. . . , 2013) a
424kbps.
Comando GetData
62
Capítulo 3. Metodologia e Implementação
Esse comando possibilita que o controlador (Arduino) receba os dados que foram
recebidos pelo PN532 do Initiator. Ele funciona apenas se o PN532 estiver configurado
em modo de Target.
A sintaxe desse comando pode ser vista na tabela 13. A sintaxe da resposta pode
ser vista na tabela 13.
Tabela 13: Sintaxe para o comando GetData
D4
86
Tabela 14: Sintaxe para a resposta do comando GetData
D5
87
Status
DATA IN
O byte de Status indica se a comunicação foi sucedida ou falha.
Em uma tipica comunicação DEP (Data Exchange Protocol), o Initiator pode
demorar um pouco para enviar os dados. O PN532 envia uma resposta para pedir mais
tempo ao controlador, que deve repetir o comando para receber os dados.
Comando SetData
Esse comando permite que o controlador forneça dados para que o PN532, mais
tarde, os envie para o Initiator. A sintaxe do comando pode ser vista na tabela 15. A
sintaxe para a resposta desse comando é bem simples, apresenta apenas um byte de Status
que deve informar se a informação foi bem sucedida e pode ser vista na tabela 16.
Tabela 15: Sintaxe para o comando SetData
D4
8E
DATA IN
Tabela 16: Sintaxe para a resposta do comando SetData
D5
8F
STATUS
3.3.1.2 LLCP
Foi desenvolvida uma classe para fazer a abstração da camada de enlace de dados
baseando-se no protocolo já comentado na seção 2.1.2.2. Alguns algoritmos utilizados
para algumas funções da classe serão explicados nessa seção.
Pode-se ver, nessa parte do código, que as camadas de rede se misturam. Algumas
das especificações do protocolo SNEP já são atribuídas a abstração da camada de enlace
de dados que foi implementada.
3.3. Software para o Arduino
63
Isso não é um problema uma vez que a aplicação tem interesse apenas em implementar o protocolo SNEP.
Quando o Android deseja enviar uma mensagem (Beam𝑇 𝑀 ), ele faz uma requisição
para se conectar como cliente, caso contrário, como servidor. Dessa forma, nessa classe,
foram elaborados:
∙ O algoritmo 3.1. Com função de fazer conexão como um client SNEP.
∙ O algoritmo 3.2. Com função de fazer conexão como um servidor SNEP.
∙ O algoritmo 3.3. Com função de receber dados do cliente.
∙ O algoritmo 3.4. Com função de enviar dados para o servidor.
Essa abstração da camada de dados também possui função de colocar os SSAP e
DSAP da comunicação nos PDUs necessários, determinar o byte de sequência3 e determinar os parâmetros que devem ser enviados nos bytes de informação em alguns casos.
configuraPN532comoTarget ( ) ;
s e r e s u l t a d o != OK
r e t o r n e ERRO;
recebePDU_PN532 ( ) ;
enviaPDU_PN532 (CONNECT) ;
recebePDU_PN532 ( ) ;
enquanto Tipo_PDU_Recebido = SYMM { // e s p e r a conexao bem s u c e d i d a
enviaPDU_PN532 (SYMM) ;
s e TIME_OUT
r e t o r n e ERRO;
recebePDU_PN532 ( ) ;
}
s e Tipo_PDU_Recebido = CONN_SUCCESS
r e t o r n e OK;
1
3
5
7
9
11
13
Algoritmo 3.1: Algoritmo de Conexão como Cliente SNEP
configuraPN532comoTarget ( ) ;
s e r e s u l t a d o != OK
r e t o r n e ERRO;
recebePDU_PN532 ( ) ;
enviaPDU_PN532 (SYMMM) ;
recebePDU_PN532 ( ) ;
enquanto Tipo_PDU_Recebido != CONN{ // e s p e r a conexao
enviaPDU_PN532 (SYMMM) ;
s e TIME_OUT
2
4
6
8
3
Para essa aplicação, ele nunca será maior que zero, uma vez que apenas uma mensagem é enviada ou
recebida por conexão devido as limitações já discutidas do Android
64
10
12
14
Capítulo 3. Metodologia e Implementação
r e t o r n e ERRO;
recebePDU_PN532 ( ) ;
}
enviaPDU_PN532 (CONN_SUCCESS) ;
r e t o r n e OK;
Algoritmo 3.2: Algoritmo de Conexão como Servidor SNEP
2
4
6
8
recebePDU_PN532 ( ) ;
enquanto Tipo_PDU_recebido != INFORMATION {
s e PDU_recebido != OK
r e t o r n e ERRO;
s e Tipo_PDU_recebido == SYMM
enviaPDU_SYMM_PN53 ;
s e TIME_OUT
r e t o r n a ERRO;
}
10
12
enviaPDU_PN532 (RECEIVE_READY) ; // Envia c o n f i r m a c a o LLCP
PN535_recebe_PDU ( ) ;
14
enviaPDU_PN532 ( I ) ; // e n v i a r e s p o s t a SNEP ( r e c e b i d o c o r r e t a m e n t e )
Algoritmo 3.3: Algoritmo de recepção de dados
2
enviaPDU_PN532 (SYMM) ;
recebePDU_PN532 ( ) ; // e s p e r a −s e um PDU de s i m e t r i a
enviaPDU_PN532 ( I ) ; // e n v i a o s dados para o s e r v i d o r SNEP
4
recebePDU_PN532 ( ) ; // e s p e r a −s e um PDU RECEIVE_READY
6
PN535_enviaPDU (SYMM) ;
8
PN535_recebe_PDU ( ) ; // e s p e r a −s e c o n f i r m a c a o SNEP (PDU t i p o I )
Algoritmo 3.4: Algoritmo de Envio de dados
3.3.1.3 SNEP
Como grande parte do protocolo SNEP já foi implementado, a função dessa abstração é basicamente gerar os cabeçalhos SNEP. Dois algoritmos simples foram implementados para fazer o PUSH (algoritmo 3.5) e o PULL (algoritmo 3.6) implementados
pelo android.
2
LLCP_conectaComoServidor ( ) ;
geraCabecalhoSnep ( ) ;
4
s e LLCP_enviaDados ( ) != OK
3.3. Software para o Arduino
65
r e t o r n a ERRO;
6
r e t o r n a OK;
Algoritmo 3.5: Algoritmo de PUSH
LLCP_conectaComoClient ( ) ;
2
4
s e LLCP_recebeDados ( ) != OK
r e t o r n a ERRO;
6
verificaCabecalhoSNEP ( dados_recebidos ) ;
8
r e t o r n a menssagem_NDEF ; // r e t i r a o c a b e c a l h o SNEP e r e t o r n a
// apenas o NDEF
Algoritmo 3.6: Algoritmo de PULL
3.3.1.4 NDEF
A função dessa abstração do formato NDEF é basicamente gerar os cabeçalhos da
mensagem NDEF, juntar as Gravações NDEF (NDEF Records), colocar corretamente os
tipos de cada gravação NDEF e os bits de começo e fim. Para contexto desse trabalho,
cada mensagem NDEF possui apenas uma gravação NDEF.
3.3.2 Implementação da Criptografia
Para satisfazer os requisitos não funcionais relacionados a segurança do sistema,
foi necessária a implementação de algumas bibliotecas de Segurança para o Arduino.
A primeira tentativa foi de fazer uma biblioteca de chave pública, a RSA. Essa
primeira tentativa foi feita no Arduino UNO, que se mostrou insuficiente para suportar
tal algoritmo. O RSA envolve apenas operações de exponenciação e MOD, porém, com
números muito grandes (pelo menos 1024 bits).
Dessa forma, usou-se apenas o AES, um método de criptografia de blocos com
chave simétrica (FIPS, 2001).
O protocolo de Diffie-Hellman, para gerar uma chave de 16 bytes, também necessitava de operações de exponenciação com números muito grandes e de geração de números
primos imensos, com mais de 300 dígitos (DIFFIE; HELLMAN, 1976). O uso do protocolo
Diffie-Hellman foi substituido, então, por o uso de uma chave de criptografia baseada em
um hash de uma mensagem que deveria ser enviada pelo Arduino e uma senha padrão,
que é usada como forma de autenticação. O funcionamento pode ser visto no diagrama
da figura 29.
66
Capítulo 3. Metodologia e Implementação
Figura 29: Esquema de geração de chave para criptografia
3.3.2.1 Implementação da Biblioteca AES
Foi implementada uma biblioteca para o Arduino para realizar criptografia AES.
Ela tem capacidade para criptografar mensagens no modo CBC e ECB, sem utilização de
padding.
Essa biblioteca foi gerada de acordo com o padrão definido em (FIPS, 2001) padrão
oficial da AES. Um exemplo da utilização da biblioteca pode ser vista no código C do
algoritmo 3.7.
i n c l u d e "DAES. h "
2
d e f i n e KEY_SIZE 16
4
6
byte_t key [ 1 6 ] = { . . . } ;
byte_t i v [ 1 6 ] = { . . . } ;
char * plain_text = " . . . " ;
8
DAES a e s ;
10
// . . .
12
14
16
void i n i t ( ) {
byte_t cryptData [ s t r l e n ( p l a i n _ t e x t ) ] ;
byte_t decryptData [ s t r l e n ( p l a i n _ t e x t ) ] ;
DAES. setKey ( key , KEY_SIZE) ;
DAES. encrypt_ECB ( cryptData , p l a i n _ t e x t , s t r l e n ( p l a i n _ t e x t ) ) ;
18
20
// c a s o modo CBC
DAES. encrypt_CBC ( cryptData , p l a i n _ t e x t , s t r l e n ( p l a i n _ t e x t ) , i v ) ;
22
// D e c r i p t
3.3. Software para o Arduino
67
DAES. decrypt_ECB ( decryptData , cryptData , s t r l e n ( p l a i n _ t e x t ) ) ;
24
DAES. decrypt_CBC ( decryptData , cryptData , s t r l e n ( p l a i n _ t e x t ) , i v ) ;
26
// t o d a s e s s a s f u n c o e s j a c o n s i d e r a m que o tamanho do p l a i n t e x t
// eh um m u l t i p l o de 1 6 , j a que nao e usado nenhum t i p o de padding
28
while (1) ;
30
}
32
34
void loop ( ) {
}
Algoritmo 3.7: Uso da Biblioteca AES
3.3.2.2 Implementação da biblioteca MD5
Foi criada uma biblioteca para geração de um HASH MD5, baseada no RFC1321
(RIVEST et al., 1992). Essa biblioteca é bastante simples e de fácil utilização. Um
exemplo de uso pode ser visto no algoritmo 3.8.
O MD5 foi utilizado pela facilidade de implementação, mas sabe-se de algumas de
suas fragilidades para utilizações que exigem certo nível de segurança. A biblioteca foi
feita para incluir novas formas de HASH e, caso necessário, uma possibilidade é incluir
SHA1 (STANDARD, 1993).
i n c l u d e "DASH. h "
2
4
c h a r * word1 = " . . . " ;
c h a r * word2 = " . . . " ;
char * s a l t = " . . . " ;
6
DASH d i g e s t ;
8
// . . .
10
12
14
16
void i n i t ( ) {
byte_t d i g e s t _ o u t [ 1 6 ] ;
digest . zerate () ;
d i g e s t . update ( word1 , s t r l e n ( word1 ) ) ;
d i g e s t . update ( word2 , s t r l e n ( word2 ) ) ;
d i g e s t . update ( s a l t , s t r l e n ( s a l t ) ) ;
18
d i g e s t . md5( d i g e s t _ o u t ) ;
20
while (1) ;
}
68
Capítulo 3. Metodologia e Implementação
22
24
void loop ( ) {
}
Algoritmo 3.8: Uso da Biblioteca HASH MD5
3.4 Algoritmo do Sistema Completo
loop {
2
esperaCelular () ;
4
envia_mensagem_NFC ( ID , GeradordeSenha ) ;
6
enquanto ! TIME_OUT {
recebe_mensagem_NFC ( ) ;
8
10
}
12
s e TIME_OUT
loop () ;
14
d e c r i p t o g r a f a ( mensagem_recebida ) ;
16
verificaComando ( ) ;
18
se ! verificaAuteticacao ()
loop () ;
20
se ! verificaAutorizacao ()
loop () ;
22
24
executaComando ( ) ;
26
}
Algoritmo 3.9: Algoritmo de Envio de dados
Pode-se ver um algoritmo bem simples apenas com a função de ilustrar o funcionamento do terminal em seu mais alto nível. Pode-se ver que a mensagem recebida passa
por uma fase de decriptografia, uma fase de verificação da autenticação e uma terceira
fase de verificação da autorização.
A fase de verificação de autenticação envolve autenticar o Servidor, o celular, e o
usuário (através de sua senha).
3.5. Protocolo criado para comunicação e autenticação
69
3.5 Protocolo criado para comunicação e autenticação
Para a comunicação entre o sistema, foi criado um protocolo. Esse protocolo
mostra como cada mensagem deve ser enviada, assinada e criptografada. Para uso desse
protocolo na comunicação NFC, foi criado um novo tipo de gravação NDEF, o tipo "D".
O aplicativo e o terminal devem reconhecer o NDEF desse tipo e tratá-lo como
será especificado.
O protocolo consiste em uma autorização do servidor, a senha do usuário e a
assinatura do aplicativo, como mostra a tabela 17.
Tabela 17: Sintaxe do protocolo criado
Autorização do Servidor
(32 bytes)
Senha do usuário
(16 bytes)
Assinatura do aplicativo
(16 bytes)
Para que a autenticação funcione, os seguintes requisitos devem ser cumpridos:
∙ O terminal e o servidor devem compartilhar uma chave de 16 bytes(𝑘𝑆𝑇 ) e uma
palavra para autenticação utilizada como salt de 16 bytes (𝐴𝑢𝑡𝑆𝑎𝑙𝑡𝑆𝑇 ).
∙ O terminal e o celular devem compartilhar uma chave de 16 bytes(𝑘𝐴𝑇 ), uma palavra
para autenticação utilizada como salt de 16 bytes (𝐴𝑢𝑡𝑆𝑎𝑙𝑡𝐴𝑇 ) e um segundo salt
para geração da senha (𝐾𝑒𝑦𝐺𝑒𝑛𝑆𝑎𝑙𝑡𝐴𝑇 ).
3.5.1 Mensagem e assinatura do servidor
A mensagem de autorização do servidor tem a sintaxe mostrada na tabela 18.
Tabela 18: Sintaxe autorização do servidor
Comando
(4 bytes)
ID Terminal
(4 bytes)
ID Aplicativo
(4 bytes)
Data expiração
(4 bytes)
Assinatura do servidor
(16 bytes)
∙ Comando indica qual o comando está sendo autorizado a ser executado.
∙ ID Terminal indica qual terminal esse comando está sendo autorizado a ser executado.
∙ ID Aplicativo indica qual aplicativo (Celular) tem autorização de executar esse
comando.
∙ Data de expiração indica até quando essa autorização é válida.
70
Capítulo 3. Metodologia e Implementação
∙ A assinatura do servidor consiste em uma criptografia AES com a chave 𝑘𝑆𝑇 de
um hash MD5 de todos os primeiros 16 bytesda mensagem de autorização mais o
𝐴𝑢𝑡𝑆𝑎𝑙𝑡𝑆𝑇 para melhorar a segurança.
AssinServer = 𝐸𝑘𝐴𝐸𝑆
(MD5(Cmd||IDTerm||IDApp||DTExp||AutSalt𝑆𝑇 ))
𝑆𝑇
Onde || indica concatenação.
3.5.2 Assinatura do Aplicativo
A assinatura do celular consiste em uma criptografia AES com a chave 𝑘𝐴𝑇 de um
hash MD5 da autorização do servidor mais a senha do usuário mais um salt 𝐴𝑢𝑡𝑆𝑎𝑙𝑡𝐴𝑇 .
AssinApp = 𝐸𝑘𝐴𝐸𝑆
(MD5(AssinServer||UserPass||AutSalt𝐴𝑇 ))
𝐴𝑇
3.6 Aplicativo para Android
Foi desenvolvido um aplicativo para o Sistema Operacional Android. O desenvolvimento foi feito com utilização da IDE Eclipse, que é recomendada para o Android
e pode ser vista na figura 30. A linguagem de programação utilizada foi o JAVA. Não
se precisou de nenhuma biblioteca externa para o desenvolvimento do software, usou-se
apenas as bibliotecas já inclusas no Android 4.0.
Figura 30: IDE Eclipse para programação em Android.
O aplicativo foi feito de forma bem simples, a pessoa deve escrever a senha em seu
celular, aproximar seu celular da antena e quando for requisitada, tocar na tela.
3.6. Aplicativo para Android
71
O aplicativo, além de ter função de fazer comunicação via NFC, deve também se
comunicar com a WEB para buscar sua autenticação com o Servidor.
3.6.1 Envio de uma mensagem NDEF com o Beam𝑇 𝑀
A utilização do Beam𝑇 𝑀 para envio de uma mensagem NDEF é feita implementandose as interfaces CreateNdefMessageCallback e OnNdefPushCompleteCallback. Um exemplo pode ser visto no algoritmo 3.10.
1
3
5
7
p u b l i c c l a s s P a s s A c t i v i t y e x t e n d s A c t i v i t y implements
CreateNdefMessageCallback , OnNdefPushCompleteCallback {
@Override
p u b l i c NdefMessage c r e a t e N d e f M e s s a g e ( NfcEvent e v e n t ) {
Log . d (TAG, " Push S t a r t " ) ;
byte [ ] s e r v e r = NFCLockerCrypt . hexStringToByteArray ( c f a . g e t A u t o r i z a t i o n
() ) ;
byte [ ] password = g e t I n t e n t ( ) . g e t S t r i n g E x t r a ( BeamActivity .
INTENT_TAG_PASS) . g e t B y t e s ( C h a r s e t . forName ( "US−ASCII " ) ) ;
ByteArrayOutputStream payload = new ByteArrayOutputStream ( ) ;
9
try {
payload . w r i t e ( s e r v e r ) ;
i f ( password . l e n g t h < 1 6 ) {
f o r ( i n t i = 0 ; i < 16 − password . l e n g t h ; i ++)
payload . w r i t e ( ( byte ) 0 ) ;
}
payload . w r i t e ( password ) ;
payload . w r i t e ( NFCLockerCrypt . md5( payload . toByteArray ( ) ) ) ;
} c a t c h ( IOException e ) {
e . printStackTrace () ;
}
11
13
15
17
19
21
NdefMessage msg = new NdefMessage (
new NdefRecord [ ] { new NdefRecord (
NdefRecord .TNF_EXTERNAL_TYPE ,
" mobi . a2d :D" . g e t B y t e s ( C h a r s e t . forName ( "US−ASCII " ) ) ,
new byte [ 0 ] , NFCLockerCrypt . a e s E n c r y p t ( payload .
toByteArray ( ) , key , i v ) )
}) ;
hand . p o s t D e l a y e d ( f i n i s h T h i s , DELAY) ;
r e t u r n msg ;
23
25
27
29
}
31
33
@Override
p u b l i c v o i d onNdefPushComplete ( NfcEvent e v e n t ) {
Log . d (TAG, "NDEF PUSH Completo " ) ;
72
Capítulo 3. Metodologia e Implementação
this . finish () ;
35
}
37
}
Algoritmo 3.10: Algoritmo Para uso do Beam𝑇 𝑀 no Android
Sobrescreveu-se dois métodos das interfaces que foram utilizadas. O método createNdefMessage, implementado na linha 4 é utilizado para geração da mensagem MDEF
nos padrões já mencionados. Pode-se ver que é especificado o tipo de gravação NDEF na
linha 25.
Na linha 28 pode-se ver a implementação de um timeout. A atividade deve ser
fechada caso fique aberta por muito tempo sem conseguir enviar uma mensagem NFC.
Para que esses métodos sejam chamados corretamente, deve-se utilizar a classe
NfcAdapter, que faz interface com o chip NFC presente no celular.
5
// . . .
NfcAdapter n f c A d a p t e r ;
@Override
p r o t e c t e d v o i d onCreate ( Bundle s a v e d I n s t a n c e S t a t e ) {
// . . .
7
n f c A d a p t e r = NfcAdapter . g e t D e f a u l t A d a p t e r ( t h i s ) ;
9
n f c A d a p t e r . setOnNdefPushCompleteCallback ( t h i s , t h i s ) ;
1
3
11
nfcAdapter . setNdefPushMessageCallback ( t h i s , t h i s ) ;
13
// . . .
}
Algoritmo 3.11: Segundo algoritmo Para uso do Beam𝑇 𝑀 no Android
3.6.2 Recebimento de uma mensagem NDEF
Para recebimento de uma mensagem NDEF, usa-se o Android Dispatch System.
Como não é permitido a utilização do chip NFC a baixo nível, faz-se um pedido ao sistema
operacional que dispare um intent 4 .
Quando esse intent é disparado, filtra-se para saber se é um tipo que a aplicação
deve utilizar. O código
// . . .
1
4
Classe do Android que consiste em uma descrição abstrata de uma operação que deve ser executada
ou de um evento acontecido
3.6. Aplicativo para Android
7
NfcAdapter n f c A d a p t e r ;
IntentFilter [ ] intentFiltersArray ;
String [ ] [ ] techListsArray ;
PendingIntent pendingIntent ;
// . . .
n f c A d a p t e r = NfcAdapter . g e t D e f a u l t A d a p t e r ( t h i s ) ;
9
nfcAdapter . setNdefPushMessageCallback ( null , t h i s ) ;
3
5
11
73
pendingIntent = PendingIntent . getActivity (
t h i s , 0 , new I n t e n t ( t h i s , g e t C l a s s ( ) ) . addFlags ( I n t e n t .
FLAG_ACTIVITY_SINGLE_TOP) , 0 ) ;
13
15
17
19
21
I n t e n t F i l t e r n d e f = new I n t e n t F i l t e r ( NfcAdapter .
ACTION_TAG_DISCOVERED) ;
try {
n d e f . addDataType ( " e x t " ) ;
n d e f . addDataAthority ( " mobi . a2d " ) ;
}
c a t c h ( MalformedMimeTypeException e ) {
throw new RuntimeException ( " f a l h a " , e ) ;
}
i n t e n t F i l t e r s A r r a y = new I n t e n t F i l t e r [ ] { ndef , } ;
23
25
t e c h L i s t s A r r a y = new S t r i n g [ ] [ ] { new S t r i n g [ ] { NfcF . c l a s s . getName
( ) } , new S t r i n g [ ] { NdefFormatable . c l a s s . getName ( ) } } ;
27
nfcAdapter . enableForegroundDispatch ( t h i s , pendingIntent ,
intentFiltersArray , techListsArray ) ;
Algoritmo 3.12: Recebimento de mensagens NDEF com Android
3.6.3 Comunicação com o Servidor
Para comunicação com o servidor, utiliza-se um segundo thread em background.
A cada vez que uma autorização é baixada, verifica-se o tempo de validade da mesma.
Uma autorização é considerada como "antiga"assim que se chega a 20% de seu prazo de
expiração. Nesse momento, o aplicativo tentará buscar uma nova autorização a cada 10
minutos se houver conexão disponível.
O aplicativo também tenta atualizar as autorizações sempre que a aplicação for
aberta.
O algoritmo 3.13 mostra como é feita a conexão com o servidor em backgorund.
c l a s s A u t o r i z a t i o n s T a s k e x t e n d s AsyncTask<Void , Void , S t r i n g > {
74
2
4
6
8
10
12
14
16
18
20
Capítulo 3. Metodologia e Implementação
// . . .
@Override
p r o t e c t e d S t r i n g doInBackground ( Void . . . params ) {
try {
URL u r l = new URL(URL_GET_AUTORIZATION) ;
HttpURLConnection conn = ( HttpURLConnection ) u r l
. openConnection ( ) ;
conn . setDoOutput ( t r u e ) ;
conn . setRequestMethod ( "POST" ) ;
S t r i n g postParams = " I d C e l l="
+ URLEncoder . encode ( i d _ c e l l , "UTF−8" ) + "&I d L o c k e r="
+ URLEncoder . encode ( id_lock , "UTF−8" ) ;
Log . d (TAG, postParams ) ;
conn . setFixedLengthStreamingMode ( postParams . g e t B y t e s ( ) . l e n g t h ) ;
conn . s e t R e q u e s t P r o p e r t y ( " Content−Type " ,
" a p p l i c a t i o n /x−www−form−u r l e n c o d e d " ) ;
conn . s e t R e q u e s t P r o p e r t y ( " Accept−C h a r s e t " , "UTF−8" ) ;
conn . s e t R e q u e s t P r o p e r t y ( " Content−Length " ,
S t r i n g . v a l u e O f ( postParams . g e t B y t e s ( ) . l e n g t h ) ) ;
conn . setFixedLengthStreamingMode ( postParams . g e t B y t e s ( ) . l e n g t h ) ;
22
OutputStream out = conn . getOutputStream ( ) ;
out . w r i t e ( postParams . g e t B y t e s ( "UTF−8" ) ) ;
out . f l u s h ( ) ;
out . c l o s e ( ) ;
conn . c o n n e c t ( ) ;
InputStream i s = conn . g e t I n p u t S t r e a m ( ) ;
String resposta = " " ;
Scanner inStream = new Scanner ( conn . g e t I n p u t S t r e a m ( ) ) ;
w h i l e ( inStream . hasNextLine ( ) )
r e s p o s t a += inStream . n e x t L i n e ( ) + " \n " ;
Log . d (TAG, r e s p o s t a ) ;
conn . d i s c o n n e c t ( ) ;
return resposta ;
} catch ( Exception e ) {
Log . d (TAG, e . t o S t r i n g ( ) ) ;
return null ;
}
24
26
28
30
32
34
36
38
40
}
42
p r o t e c t e d v o i d onPostExecute ( S t r i n g param ) {
i f ( param . s t a r t s W i t h ( "OK" ) ) {
S t r i n g [ ] r e s p = param . s p l i t ( " \n " ) ;
setAut ( r e s p [ 1 ] ) ;
Log . d (TAG, " PostEx aut : "+r e s p [ 1 ] ) ;
Log . d (TAG, " PostEx aut : "+g e t A u t o r i z a t i o n ( ) ) ;
}
44
46
48
3.7. Aplicativo web
}
50
52
75
}
Algoritmo 3.13: Recebimento de mensagens NDEF com Android
3.7 Aplicativo web
O aplicativo web foi escrito em PHP (WELLING; THOMSON, 2003) e HTML e,
em sua maior parte, consiste em um Banco de Dados MySQL(WELLING; THOMSON,
2003) implementado utilizando-se a linguagem SQL.
A interface é feita de forma bem simples e pode ser acessada facilmente pelo
browser por qualquer um que tiver uma senha de administrador.
A IDE utilizada foi o NETBeans, que pode ser vista na figura 31.
Figura 31: IDE - NETBeans
3.7.1 Banco de Dados
O banco de dados do servidor deve gravar os dados dos usuários e de cada fechadura, para isso foram necessárias a criação de 4 tabelas, uma para as fechaduras, outra
para os administradores, uma terceira para usuários e uma quarta tabela para guardar
relacionamentos. A figura 32 mostra o diagrama Entidade Relacionamento do banco de
dados.
76
Capítulo 3. Metodologia e Implementação
Figura 32: Diagrama Entidade-Relacionamento
3.7.2 A interface
O site que implementa a interface WEB foi hospedado em http://a2d.mobi/5 .
E pode ser acessado diretamente pelo endereço http://a2d.mobi/AppNfc/. A primeira
tela, é a tela de Login, como mostrada na figura 33.
Após autenticação do usuário através de seu login e senha, na segunda tela ele pode
gerenciar todas as suas fechaduras cadastradas (figura 34). Clicando em "Ver Usuários",
o administrador pode modificar o status de cada usuário individualmente (figura 35).
Figura 33: Primeira tela do aplicativo WEB
Figura 34: Administração das Fechaduras
5
A2d é empresa que seria criada como responsável pela implementação e instalação do sistema.
3.7. Aplicativo web
77
Figura 35: Modificar Status de usuários
79
4 Resultados e Testes
Neste capitulo se discorrerá sobre os resultados, testando-se a comunicação NFC,
a velocidade e eficiência da criptografia, a comunicação com a internet.
A primeira seção mostra todos os protocolos já vistos anteriormente funcionando
corretamente. As próximas mostram testes de qualidade do software, mostrando as velocidades de execução das operações realizadas pelo sistema.
4.1 Comunicação NFC
Para demonstração do funcionamento da comunicação NFC, foi feito, em um uso
típico, utilizando a serial do computador, um log de todos os dados que se passam pela
comunicação SPI entre o Arduino e o PN532. Dessa forma será possível ver todos os
protocolos sendo utilizados.
Não será comentado sobre todo o log, apenas sobre as partes importantes para
este trabalho.
A primeira mensagem que se pode ver, é:
envio: 0 0
resposta: 0 FF
FF 5
2 FE
FB
D5
D4
15
14
1
14
1
0x2
0x0
Ela apenas envolve configuração do SAM (Security Access Manager), sua sintaxe
pode ser vista na seção sobre o PN532.
Logo depois:
envio:
resposta:
0
40
0
89
0
1D
6D
0 FF
1 FE
0
0
0
0
FF 21
5E 12
1
1
2D D3
F BB
0
FF
6
46
DF D5
68 EF
11
3
D4
BA
FF
66
8D
1E
2
8C 0
A6 C9
1 FE
6D 1
25 1E
C1 0
0
13
0
89
F
1
D4
0
4
0
0
BB
10
0
0
1
0
0
0
0
BA A6
0 0x3B
18
1E
32
46
96
0
0
C9
0x0
12
66
Esse comando, mostra o InitAsTarget. A resposta só é recebida quando o Initiator
está próximo.
80
Capítulo 4. Resultados e Testes
Esses primeiros comandos não envolvem os protocolos de comunicação NFC de
forma direta, apenas configurações essenciais para que o PN532 se comunique corretamente.
No terceiro log pode-se ver:
envio 0 0 FF 2
resposta 0 FF 5 FB
FE
D5
D4
87
86
0
0xA6
0
0x0
0
Agora pode-se ver um comando GetData. A resposta mostrada é um PDU do tipo SYMM.
O PN532 está se comunicando corretamente com o initiator.
Alguns logs adiante, pode-se ver o PDU do tipo Connect:
envio: 0 0 FF 4
resposta: 0 FF 3 FD
FC
D5
D4
8F
8E
0
11
20
0x6D
0x0
Pode-se ver o envio da mensagem NFC finalmente em:
envio:
resposta:
0 0
0 0
0 FF
FF
8
3
13 ED
D1
1
FD D5
D4
4
8F
8E
44
0
13
0
20 0
0 0
preambulo PN532:
0
0
Tamanho e CS do tamanho:
13
ED
Comando para o PN532:
D4
8E
10
2
1 0x36
0
0x0
Nessa mensagem pode-se distinguir:
FF
Agora pode-se ver no PDU
DSAP, Tipo PDU e SSAP:
13
Byte de sequencia
0
20
Pode-se ver que: DSAP = 000100b, Tipo = 1100b (I), SSAP = 100000b
Então tem-se o cabeçalho do SNEP:
Versão e request:
10
2 (PUT)
Bytes de tamanho
0
0
Agora tem-se o cabeçalho NDEF
0
8
4.1. Comunicação NFC
81
Flag, tamanho do tipo
D1
Tamanho do payload
4
Tipo
44
1
Então pode-se ver, finalmente, a carga útil da mensagem, que nesse caso é apenas
o ID do terminal (0x00000001).
Depois da mensagem enviada, pode ser visto o PDU tipo DISCONNECT.
Envia: 0 0 FF 4
Resposta: 0 FF 3 FD
FC
D5
D4
8F
8E
25
11
60
0x2D
0x0
Agora o objetivo é conectar para receber uma mensagem NDEF, dessa forma o
terminal deve ser iniciado como servidor, o Android deve pedir a conexão. Isso pode ser
visto em um comando getData mais adiante.
Envia: 0 0 FF 2
Resposta: 0 FF 5 FB
FE
D5
D4
87
86
0
0xA6
11
0x0
20
Pode-se ver o PDU tipo Connect sendo recebido e logo depois a mensagem NDEF
sendo recebida:
Envia:
Resposta:
00
00
00
6F
DE
AE
6F
DC
00 FF 02
FF 50 B0
00 00 44
01 B0 9F
D9 B6 09
51 AE 31
39 36 E4
14 2E 4C
FE D4 86
D5 87 00
D1 01 40
20 2D 60
72 6F 8C
BD C8 2F
7E A9 D3
1A F0 66
A6 00
13 20
44 B5
48 94
7A DC
D6 F3
EF A9
EF 2B
00 10 02
ED CB E0
AF 1B A6
64 08 18
0B AC 5F
26 15 2B
F0 25 06
Na resposta do comando getData pode-se ver o PDU após os bytes de preâmbulo,
tamanho, checksum do tamanho e comando. Então percebe-se:
O cabeçalho do PDU:
DSAP, Tipo PDU e SSAP:
13
Byte de sequencia
0
20
O cabeçalho do SNEP:
Versão e request:
10
2 (PUT)
Bytes de tamanho
0
0
0
44
82
Capítulo 4. Resultados e Testes
O cabeçalho do NDEF:
Flag, tamanho do tipo
D1
Tamanho do payload
40
Tipo
44
1
e finalmente a carga útil:
B5 ED CB E0 6F 01 B0 9F 20 2D 60 48 94 AF 1B A6 DE D9 B6 09 72 6F 8C 7A DC 64
08 18 AE 51 AE 31 BD C8 2F D6 F3 0B AC 5F 6F 39 36 E4 7E A9 D3 EF A9 26 15 2B
DC 14 2E 4C 1A F0 66 EF 2B F0 25 06
que após ser descriptografada é:
00 00 00 01 00 00 00 01 00 00 00 01 52 65 92 17 FD 20 4F 21 10 A0 22 3A 7E 12 5B 30
92 14 FA 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 99 47 FA 7C 97 C3 0A 1D
84 84 EE F5 53 51 7A AE
pode-se ver, então, o protocolo criado:
Comando
0
0
0
Id do Terminal
1
0
0
0
1
Id do Aplicativo
0
0
Expiração
0
1
52
65
92
17
12
5B
30
92
14
FA
7
0
0
0
0
0
0
0
EE
F5
53
51
7A
AE
Assinatura do servidor
FD
20
4F
21
10
A0
22
3A
7E
Senha
0
0
0
0
0
0
0
0
0
Assinatura do celular
99
47
FA
7C
97
C3
0A
1D
84
84
4.2 Testes da comunicação NFC
Para teste da velocidade de comunicação via NFC, implementou-se uma rotina no
Android para calcular o tempo que cada parte da comunicação levava. Não foi feito um
teste criterioso com muitas medições e métodos estatísticos, apenas coletou-se a timestamp
de cada evento, calculou-se a diferença e tirou-se uma média. O resultado dessas medidas
podem ser vistas na tabela 19.
Todos esses testes foram feitos com utilização do Arduino MEGA. O celular utilizado foi o Sansung Galaxy SIII rodando o sistema operacional Android Jelly Beam v4.1.2.
Deve-se definir:
4.2. Testes da comunicação NFC
83
Tabela 19: Testes de comunicação NFC
N
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Média Total
Evento 1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Evento 2
36
4
3
3
4
3
3
2
3
3
2
2
2
2
3
5,0
Evento 3
164
93
73
200
89
79
76
85
84
82
73
69
118
78
87
96,7
Evento 4 Evento 5 Evento 6
1239
1248
2256
5073
5074
6095
5222
5223
6215
5747
5747
6745
5755
5756
6637
6183
6183
7040
1971
1972
2964
5107
5107
6084
3793
3794
4576
3821
3822
4190
1943
1943
2757
4856
4857
5786
4229
4229
5055
6553
6553
7500
3789
3789
4596
4352,0
4353,1
5233,1
*Valores em ms (mili segundos)
∙ Evento 1: Mensagem NDEF Recebida do terminal. Esse é o referencial utilizado,
considerado o tempo zero.
∙ Evento 2: Mensagem decodificada e chaves geradas. Após esse evento, as chaves
que devem ser utilizadas para criptografia já foram geradas.
∙ Evento 3: Atividade de Envio Iniciada. O tempo para isso acontecer pode variar
de acordo com a quantidade de memória disponível no celular.
∙ Evento 4: Preparado para envio. O Android já recebeu requisição do Servidor
SNEP para envio da mensagem e o usuário já autorizou com um toque na tela.
∙ Evento 5: Mensagem criptografada e codificada. Em geral os processos de criptografia acontecem de forma bem rápida no Android, principalmente para um método
rápido como o AES.
∙ Evento 6: Mensagem enviada. Foi recebida confirmação do Servidor SNEP que os
dados foram enviados corretamente.
Pode-se perceber que em nenhum dos 15 testes houve falha na comunicação, o que
indica estabilidade do sistema. Apesar disso, foram detectadas algumas falhas em outros
testes feitos e não documentados. Dessa forma, é sabido que o sistema pode apresentar
instabilidades eventuais em algumas situações, o motivo destas ainda é desconhecido.
Vê-se que o evento mais custoso em todo o processo é o 4. Isso se deve ao fato de
que entre os eventos 1 e 4, o Arduino deve requisitar desconexão como cliente SNEP (o
84
Capítulo 4. Resultados e Testes
Figura 36: Histograma dos dados da tabela 19
Android funciona como Servidor nessa fase) e requisitar conexão novamente, mas dessa vez
como Servidor (após o evento 3, o Android deve funcionar como cliente SNEP). Apesar do
baixo número de amostras, o histograma apresentado na figura 36 mostra a alta variação
no tempo de comunicação.
4.3 Comunicação com o servidor
Repetiu-se o mesmo processo de gerar timestamps para se fazer testes em relação
conexão com a internet. Dessa vez agendou-se uma grande quantidade de conexões com
o objetivo de testar as velocidades de conexão utilizando WiFi e Dados móveis. Os
resultados medidos podem ser vistos na tabela 20.
Para esse teste também foi utilizado o celular Sansung Galaxy SIII rodando o
sistema operacional Android Jelly Beam v4.1.2.
Tabela 20: Média de tempo de comunicação com o aplicativo WEB
Conexão
WiFi
Dados móveis
N
103
82
Evento 1
0
0
Evento 2
1
1
Evento 3 Evento 4 Evento 5
428
511
527
3296
3545
3553
*Valores em ms (mili segundos)
∙ Evento 1: Inicio da tentativa de conexão. Esse é o referencial utilizado, considerado
o tempo zero.
4.3. Comunicação com o servidor
85
∙ Evento 2: Parâmetros prontos para serem enviados. O request HTTP foi criado
com todas as variáveis que devem ser enviadas em POST.
∙ Evento 3: Conexão estabelecida. O servidor já respondeu com as informações
desejadas.
∙ Evento 4: Desconectado. O socket de conexão foi finalizado.
∙ Evento 5: Dados gravados. Os dados recebidos foram descriptografados e guardados no banco de dados do celular,
Vemos uma grande diferença no tempo de conexão para os diferentes tipos. O
teste mostra que pode ser utilizado o modelo alternativo de sempre buscar uma nova
autenticação no servidor quando o dispositivo detectar proximidade com a fechadura. O
tempo médio para uma conexão, mesmo da forma mais lenta, ainda é menor que o tempo
desde a detecção da fechadura até o momento que os dados são codificados para enviar.
Como nem sempre uma conexão está disponível, utiliza-se um modelo em que a
validade de uma autorização é maior que 1 dia.
87
5 Conclusão
Neste trabalho fez-se uso da tecnologia NFC para comunicação entre um celular
e uma plataforma para controle de acesso (fechadura elétrica). O objetivo foi a criação de uma ferramenta de controle de acesso intuitiva e de fácil instalação e utilização,
demonstrando a tecnologia e como ela pode ser usada em dispositivos de segurança.
Para confecção dessa ferramenta, fez-se uso de um periférico baseado no chip NFC
PN532, que foi testado em três plataformas diferentes, todas baseadas na plataforma
de prototipagem Arduino. Para que isso fosse viável, implementou-se uma biblioteca
de aplicação dos protocolos NFC conhecidos e já utilizados pelos smartphones com essa
tecnologia.
Além disso, criou-se bibliotecas de criptografia e segurança para o Arduino, que
até então não estavam disponíveis, elaborou-se um aplicativo para o sistema operacional Android e produziu-se um aplicativo Web para ser utilizado para administração de
diferentes fechaduras.
Na elaboração da solução técnica para o projeto, duas grandes dificuldades foram
encontradas.
A primeira delas interfere nos requisitos funcionais do sistema e envolve a elaboração do software para comunicação NFC entre o celular e o Arduino.
Um grande número de parâmetros deve ser utilizado para definir como será a comunicação. A frequência de modulação, a velocidade de transmissão de dados e os tipos
de protocolos de baixo nível são exemplos disso. Foram utilizados os códigos fontes do sistema operacional Android além dos documentos técnicos para que todos esses parâmetros
pudessem ser determinados de forma correta.
A implementação dos protocolos de mais alto nível foi possível graças a grande
quantidade de informação disponível na internet e a documentação bem detalhada de
cada um deles presente no Fórum NFC.
A segunda grande dificuldade envolveu um requisito não funcional muito importante para o sistema: a criptografia. A maioria dos protocolos de autenticação utiliza
criptografia com chave pública e privada para geração de assinaturas, isso não foi possível
em função da complexidade do algoritmo implementado e a capacidade de processamento
e memória RAM do hardware utilizado (Arduíno).
Apesar de todas as dificuldades, conseguiu-se atender os requisitos do sistema
para a finalidade do trabalho. O NFC se mostrou uma maneira prática e intuitiva para o
projeto proposto.
88
Capítulo 5. Conclusão
Os testes que se referem a comunicação NFC mostram algumas falhas e perda de
sincronia. Elas se devem ao modo como as bibliotecas que implementam essa tecnologia
no Android funcionam, uma vez que foram feitas apenas para comunicação de uma via
entre dois celulares.
A segurança do sistema foi elaborada baseada em ferramentas criptográficas já
existentes e comprovadamente eficazes, uma vez que é conhecido o perigo em se criar
algoritmos próprios para essa finalidade.
Apesar dos protocolos de segurança serem bem definidos e atenderem aos requisitos, o sistema falha quanto ao modelo de armazenamento das chaves de segurança. Caso
um invasor consiga fazer um acesso direto a EEPROM do arduino, ele poderá facilmente
encontrar as senhas.
Aplicar engenharia reversa no código executável também pode se apresentar extremamente eficiente para descoberta de chaves de segurança do sistema.
Caso o trabalho seja continuado, algumas sugestões para melhoria do sistema,
podem ser:
∙ Utilização do Android no modo emulação de cartão. Essa aplicabilidade
ainda não é disponível mas deve estar presente como funcionalidade adicional nas
próximas atualizações da API.
∙ Utilização de métodos de HASH mais seguros que o MD5. Apesar de
ter sido considerado seguro para o contexto deste trabalho, alguns métodos, como
SHA1 (STANDARD, 1993), possuem uma resistência a colisão comprovadamente
muito maior que o utilizado.
∙ Implementação de criptografia assimétrica apenas para autenticação. Para
essa aplicação a autenticação é mais importante que o próprio sigilo. A implementação de uma biblioteca RSA para finalidade especifica de verificação da assinatura
é bem mais simples que a que tentou-se desenvolver, uma vez que envolvia geração
de chaves públicas e privadas.
∙ Reimplementação do método de gravação das chaves na EEPROM. As
chaves se tornam facilmente identificadas na EEPROM devido a sua aleatoriedade.
A ATMEL desenvolveu uma cryptomemory, uma EEPROM com a única finalidade
de gravar chaves, que pode ser utilizada adicionalmente. Poderia-se também adicionar uma segunda criptografia para gravação dos dados, como por exemplo.
∙ Implementação da segurança do meio físico. Definir como os módulos do
hardware devem ser posicionados para garantir a segurança. Caso uma pequena
89
parte do fio que aciona a fechadura fique aparente, toda a segurança dos sistema é
comprometida.
91
Referências
ANDROID Developers. 2013. Disponível em: http://developer.android.com. Acesso
em: outubro de 2013. Citado 2 vezes nas páginas 39 e 40.
BELLARE, M.; KILIAN, J.; ROGAWAY, P. The security of the cipher block chaining
message authentication code. Journal of Computer and System Sciences, Elsevier, v. 61,
n. 3, p. 362–399, 2000. Citado 2 vezes nas páginas 47 e 49.
DEVELOPER Economics Q3 2013 analyst report. 2013. Disponível em: http:
//www.visionmobile.com/DevEcon3Q13. Acesso em: outubro de 2013. Citado na
página 39.
DIFFIE, W.; HELLMAN, M. New directions in cryptography. Information Theory,
IEEE Transactions on, IEEE, v. 22, n. 6, p. 644–654, 1976. Citado 2 vezes nas páginas
44 e 65.
FIPS, P. 197, advanced encryption standard (aes). National Institute of Standards and
Technology, 2001. Citado 3 vezes nas páginas 52, 65 e 66.
GOOGLE Wallet. 2013. Disponível em: http://www.google.com/wallet/. Acesso em:
outubro de 2013. Citado na página 25.
HASELSTEINER, E.; BREITFUSS, K. Security in near field communication (nfc). In:
Workshop on RFID Security RFIDSec. [S.l.: s.n.], 2006. Citado na página 29.
IDC - World Wide Mobile Phone Tracker. 2013. Disponível em: http://www.idc.com/
getdoc.jsp?containerId=prUS24257413. Acesso em: outubro de 2013. Citado na
página 39.
KUMAR, A. Near field communication. 2011. Citado 2 vezes nas páginas 26 e 29.
MAJOR Samsung Visa partnership announced at the MWC 2013.
2013. Disponível em: http://investincotedazur.com/en/newsletter/
nfc-major-samsung-visa-partnership-announced-at-the-mwc-2013&artid=
act11035. Acesso em: outubro de 2013. Citado na página 29.
NFC - FORUM. NFC Data Exchange Format (NDEF) Technical Specification. 2006.
Também disponível em: http://www.nfc-forum.org/specs/spec_license/document_
form/custom_layout?1383275628106. Acesso em: outubro de 2013. Citado na página
38.
NFC - FORUM. Logical Link Control Protocol Technical Specification. 2011. Disponível
em: http://www.nfc-forum.org/specs/spec_license/document_form/custom_
layout?1382382479760. Acesso em: outubro de 2013. Citado na página 32.
NFC - FORUM. NFC - Forum. 2013. Disponível em: http://www.nfc-forum.org/.
Acesso em: outubro de 2013. Citado na página 29.
92
Referências
NFC - FORUM. NFC Digital Protocol Technical Specification. 2013. Disponível em:
http://www.nfc-forum.org/specs/spec_license/document_form/custom_layout?
1383288838060. Acesso em: outubro de 2013. Citado 3 vezes nas páginas 31, 32 e 61.
NFC - FORUM. Simple NDEF Exchange Protocol Technical Specication. 2013. Disponível
em: http://www.nfc-forum.org/specs/spec_license/document_form/custom_
layout?1383260113926. Acesso em: outubro de 2013. Citado na página 35.
NXP - PHILIPS. UM0701-02 PN532 - User Manual. [S.l.], 2007. V1.6. Citado 2 vezes
nas páginas 55 e 60.
RIVEST, A. S. R.; ADLEMAN, L. A method for obtaining digital signatures and
public-key cryptosystems. Communications of the ACM, v. 21, p. 120–126, 1978. Citado
2 vezes nas páginas 46 e 47.
RIVEST, R. L. et al. RFC 1321: The MD5 message-digest algorithm. [S.l.]: April, 1992.
Citado 2 vezes nas páginas 48 e 67.
SCHNEIER, B. Applied Criptography. New York: John Wiley, 1996. Citado 2 vezes nas
páginas 41 e 42.
SONY Products - FeliCa. 2013. Disponível em: http://www.sony.net/Products/
felica/. Acesso em: outubro de 2013. Citado na página 61.
STANDARD, S. H. Federal information processing standard publication# 180. US
Department of Commerce, National Institute of Standards and Technology, v. 56, p.
57–71, 1993. Citado 3 vezes nas páginas 48, 67 e 88.
TANENBAUM, A. S. Redes de Computadores. Rio de Janeiro: Editora Campus, 1997.
Citado 6 vezes nas páginas 42, 43, 44, 47, 48 e 49.
WELLING, L.; THOMSON, L. PHP and MySQL Web development. [S.l.]: Sams
Publishing, 2003. Citado na página 75.
Apêndices
95
APÊNDICE A – Esquemático do Primeiro
Protótipo do Terminal
97
APÊNDICE B – Esquemático do Protótipo
Final do Terminal
Download

Proposta para controle de acesso físico seguro baseada em Near