comunicação entre java e arduino com autenticação

19
Comunicação entre Java e Arduino com Autenticação Murilo Dias Kiyomura 1 , Julio Telles 1 1 Sistema de Informação – Centro Universitário do Triângulo (UNITRI) – Av. Nicomedes Alves dos Santos, 4545, Bairro Gávea - CEP 38.411-106 – Uberlândia – MG – Brasil [email protected], [email protected] Abstract. The development of IoT (Internet of Things) devices has been a fast growing area, and there are great opportunities in the financial market. Because of this he has become the target of research by academics as well as becoming a target of hackers. This article aims to present the most commonly used Internet communication protocols on IoT devices and to point out a possible way to avoid unauthorized attacks and accesses on Arduino devices using authentication. The article will allow a greater understanding of the concepts of IoT, communication protocols for limited devices, programming for Arduino, also the development of the authentication method. Resumo. O desenvolvimento e a incrementação de dispositivos IoT (Internet das Coisas ) na vida das pessoas e empresas têm sido uma área que cresce em ritmo acelerado. Nesta área, observam-se grandes oportunidades no mercado financeiro. Devido a isso, ela tem sido cada vez mais explorada pela pesquisa acadêmica, mas também se tornou alvo de criminosos virtuais. Este artigo tem como finalidade apresentar os protocolos de comunicação da arquitetura Internet mais utilizados em dispositivos IoT. E também apontar uma possível maneira de evitar ataques e acessos não autorizados em dispositivos Arduino, através da autenticação. O objetivo é apresentar as principais características dos protocolos utilizados em contexto de Internet das Coisas, bem como um estudo de caso envolvendo método de autenticação com o Arduino e a tecnologia Java. Palavras Chave. IoT, Segurança, Arduino, Protocolos web, Java. 1 Introdução A internet vem revolucionando a forma de pensar e agir das pessoas, sobretudo como elas se comunicam, desde 1988. Nesta época, começaram as primeiras pesquisas de comunicação e transmissão de dados pela Bitnet, tecnologia anterior à Internet e ao Word Wide Web[RNP 2015]. Com essa revolução tecnológica, surgiram novas possibilidades de conectar e transformar o dia a dia das pessoas com a internet. Quando se fala desse assunto, um dos conceitos mais atuais é o de “Internet of Things” (IoT), ou Internet das Coisas. O termo consiste na ideia da conexão do mundo físico (equipamentos) ao mundo virtual feito via internet, representando uma grande evolução. Atualmente, uma das plataformas mais difundidas para aplicações IoT entre os desenvolvedores é o Arduino, que consiste em um dispositivo eletrônico que pode ser

Upload: others

Post on 18-Nov-2021

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Comunicação entre Java e Arduino com Autenticação

Comunicação entre Java e Arduino com Autenticação

Murilo Dias Kiyomura1, Julio Telles1

1Sistema de Informação – Centro Universitário do Triângulo (UNITRI) – Av. Nicomedes Alves dos Santos, 4545, Bairro Gávea - CEP 38.411-106 – Uberlândia –

MG – Brasil

[email protected], [email protected]

Abstract. The development of IoT (Internet of Things) devices has been a fast

growing area, and there are great opportunities in the financial market.

Because of this he has become the target of research by academics as well as

becoming a target of hackers. This article aims to present the most commonly

used Internet communication protocols on IoT devices and to point out a

possible way to avoid unauthorized attacks and accesses on Arduino devices

using authentication. The article will allow a greater understanding of the

concepts of IoT, communication protocols for limited devices, programming

for Arduino, also the development of the authentication method.

Resumo. O desenvolvimento e a incrementação de dispositivos IoT (Internet

das Coisas ) na vida das pessoas e empresas têm sido uma área que cresce em

ritmo acelerado. Nesta área, observam-se grandes oportunidades no mercado

financeiro. Devido a isso, ela tem sido cada vez mais explorada pela pesquisa

acadêmica, mas também se tornou alvo de criminosos virtuais. Este artigo tem

como finalidade apresentar os protocolos de comunicação da arquitetura

Internet mais utilizados em dispositivos IoT. E também apontar uma possível

maneira de evitar ataques e acessos não autorizados em dispositivos Arduino,

através da autenticação. O objetivo é apresentar as principais características

dos protocolos utilizados em contexto de Internet das Coisas, bem como um

estudo de caso envolvendo método de autenticação com o Arduino e a

tecnologia Java.

Palavras Chave. IoT, Segurança, Arduino, Protocolos web, Java.

1 Introdução

A internet vem revolucionando a forma de pensar e agir das pessoas, sobretudo como elas se comunicam, desde 1988. Nesta época, começaram as primeiras pesquisas de comunicação e transmissão de dados pela Bitnet, tecnologia anterior à Internet e ao Word Wide Web[RNP 2015].

Com essa revolução tecnológica, surgiram novas possibilidades de conectar e transformar o dia a dia das pessoas com a internet. Quando se fala desse assunto, um dos conceitos mais atuais é o de “Internet of Things” (IoT), ou Internet das Coisas. O termo consiste na ideia da conexão do mundo físico (equipamentos) ao mundo virtual feito via internet, representando uma grande evolução.

Atualmente, uma das plataformas mais difundidas para aplicações IoT entre os desenvolvedores é o Arduino, que consiste em um dispositivo eletrônico que pode ser

Page 2: Comunicação entre Java e Arduino com Autenticação

programado através de uma interface simples. No início dos anos 2000, um grupo de pesquisadores do norte da Itália iniciou o projeto – uma placa eletrônica de prototipagem de baixo custo e fácil de programar. O Arduino popularizou-se e atualmente tem impulsionado o mercado de dispositivos IoT.

Observa-se o aumento de ataques em dispositivos IoT, as tendências de mercado e também o desenvolvimento das pesquisas tecnológicas voltadas para a área. Segundo dados do Núcleo de Informação e Coordenação do Ponto BR - NIC.br, em 2016 houve um aumento de 138% de ataques de negação de serviço, conhecido como DDoS. Cristine Hoepers, gerente do Centro de Estudos, Resposta e Tratamento de Incidentes de Segurança no Brasil - CERT.br, alertou também sobre o aumento das varreduras de Telnet , que visam aos ataques em dispositivos IoT [NIC.Br 2017].

Já existem pesquisas analisando, em termos técnicos, a eficiência de protocolos voltados especificamente para dispositivos IoT. Rotta e Charao (2017) realizaram um estudo sobre os protocolos de comunicação para ambiente de Internet das Coisas.

Brezolin (2017) apresenta uma proposta de autenticação simplificado e interativo com dispositivos IoT. A proposta é demonstrada em um sistema web ligado a um dispositivo IoT que capta informações da qualidade do ar do ambiente e as apresenta em uma pagina web.

Não foram observadas pesquisas voltadas para a utilização de autenticação entre Arduino e Java. Portanto o objetivo deste artigo é apresentar os protocolos de comunicação e apontar uma possível maneira de evitar ataques e acessos não autorizados em dispositivos Arduino, utilizando autenticação. Foi feita uma análise dos protocolos de comunicação via internet mais utilizados em projetos desse dispositivo, listando suas características. Após a análise, será desenvolvido um ambiente “cliente/servidor”, com um método de comunicação e autenticação, de forma que o Arduino atue como um servidor, e uma aplicação em Java como cliente.

Serão abordados, nas seções seguintes, os conceitos de internet das coisas, Arduino, características de alguns protocolos de comunicação, desenvolvimento do cliente Java e do servidor, resultados obtidos e a conclusão do estudo.

2 Internet das Coisas

O termo “Internet of Things” (IoT), ou Internet das Coisas, foi utilizado pela primeira vez em 1999 por Kevin Ashton, pesquisador britânico do Massachusetts Institute of Technology (MIT). Kevin observou que a maioria dos dados contidos em um sistema na internet foi inserida manualmente por seres humanos, de forma lenta e ineficiente. E que esses dados, em geral, poderiam conter erros. Uma alternativa seria se esses sistemas pudessem se conectar a sensores que medem diretamente as propriedades ou eventos do mundo real, e alimentassem o sistema com os dados obtidos. Assim, os dados serão mais corretos e com maior volume.

A IoT é o que se obtém quando é conectado as coisas, aquelas não operadas por seres humanos, para a Internet.[Waher 2015]. Gartner define a IoT como “uma rede de objetos físicos, que contém tecnologia para se comunicar, sentir e interagir com seus estados ou com o ambiente externo.”[Panetta 2016] Para o autor, a IoT, em 2009, possuía 0,9 bilhões de unidades. Em 2020 chegará em 26 bilhões, transformando os

Page 3: Comunicação entre Java e Arduino com Autenticação

processos de negócios desde a linha de produção até as prateleiras do supermercado.[Panetta 2016]

Portanto, a IoT é muito mais que conseguir ligar e desligar uma lâmpada pelo telefone, ou verificar a temperatura do local em que está instalado. Não é somente ligar as “coisas” na internet, é torná-las inteligentes, adaptáveis ao usuário e ao ambiente, melhorando a produtividade, o bem-estar e a qualidade de vida de modo geral.

Uma das preocupações no desenvolvimento de dispositivos IoT é o custo-benefício do projeto. Uma das plataformas mais utilizadas atualmente é a Arduino, devido a sua flexibilidade, facilidade de uso e de programação, e custo acessível.

3 Arduino

A princípio, o Arduino é uma derivação do Wiring: uma plataforma construída por Hernado Barragan como tese de seu mestrado. O projeto começou no início dos anos 2000, pelo grupo de pesquisadores David Cuartielles, Gianluca Martino, Massimo Banzi, Tom Igoe, e David Mellis, no Interaction Design Institute de Ivrea, no norte da Itália.

O objetivo inicial era elaborar um dispositivo acessível para estudantes e projetistas que fosse fácil de programar, funcional e, ao mesmo tempo, de baixo custo. Foi adotado também o conceito de hardware livre: qualquer um pode modificá-lo (desmontar, melhorar, personalizar) da maneira que quiser, partindo do hardware básico.

Segundo informações do site oficial [Arduino 2018]: “O Arduino é uma plataforma de Open-Source de prototipagem eletrônica baseada na flexibilidade, hardware e software fácil de usar”.

O projeto proposto neste artigo utiliza a versão Arduino UNO, que conta com um microcontrolador ATmega328P de 16 MHz, possui 14 pinos de entrada/saída, 32 KB de memória flash. O Arduino Uno pode ser alimentado via cabo USB ou por uma fonte de alimentação externa. [Arduino 2018a]

A Figura 1 mostra a estrutura da placa, seus conectores e dispositivos.

Page 4: Comunicação entre Java e Arduino com Autenticação

Figura 1 – Resumo dos recursos Arduino UNO [Souza 2013]

4 Protocolos de Comunicação WEB

A comunicação entre dois dispositivos computacionais se dá através de um protocolo que gera as regras e as sintaxes. Dessa forma, os componentes da rede trocarão mensagens e dados entre si. O protocolo tem como objetivo padronizar e possibilitar a conexão, comunicação e transferência de dados entre sistemas computacionais.

O funcionamento dos protocolos de comunicação via internet são descritos nos documentos RFC -Request for Comments - em português, "pedido de comentários". Estes são desenvolvidos e mantidos pela organização IEFT - Internet Engineering Task Force.

Uma característica importante a ser observada nos protocolos em nível de aplicação é o fluxo de dados utilizado para transporte: se UPD ou TCP:

• UDP (User Datagram Protocol): não possui mecanismos que garantem a entrega dos pacotes, já que seu objetivo é, sobretudo, a rapidez na transferência [Postel 1980]. A utilização desse protocolo é recomendada em fluxos de multimídia. As especificações estão descritas na RFC 768.

• TCP (Transmission Control Protocol): ao contrário do UDP, possui mecanismos que garantem a entrega dos pacotes de dados. Porém, isso compromete sua velocidade de transferência. A RFC 793 descreve as especificações do protocolo [Postel 1981].

Devido ao grande aumento de dispositivos IoT, a IEFT vem realizando pesquisas para o desenvolvimento de protocolos que consomem menos energia e memória. Eles são mais adequados para a utilização em dispositivos com limitações, tanto de poder de processamento quanto de conexão.

As seções a seguir descreverão importantes protocolos de comunicação web e suas características relevantes.

Page 5: Comunicação entre Java e Arduino com Autenticação

4.1 Protocolo HTTP

HTTP é a sigla para “Hyper Text Transfer Procol”, em tradução livre: “Protocolo de transferência de HiperTexto”. Trata-se de um protocolo de nível de aplicação, possui velocidade necessária para sistemas de informações distribuídos e colaborativos. É genérico, sem estado e orientado a objetos. Está em uso na internet desde 1990 e é um dos protocolos de comunicação mais utilizados na Internet. [Berners-Lee et al. 1996]. A RFC 1945 contém as suas especificações técnicas.

Em síntese, é um protocolo de solicitação/resposta. Os clientes solicitam informações de um servidor e este responde a tais solicitações de acordo, de forma síncrona. Ou seja, o cliente espera a resposta vinda do servidor.

Uma solicitação é composta, basicamente, por um método, um recurso, alguns cabeçalhos e conteúdo. A resposta é composta por um código de status composto por três dígitos, alguns cabeçalhos e um conteúdo opcional. Utiliza a camada de transporte o protocolo TCP, o que garante a entrega dos pacotes. Por padrão, a comunicação HTTP utiliza a porta 80, porém isso não impede a utilização dele em outras. Quando não especificado, utiliza a porta padrão.

O protocolo HTTP possui um esquema de autenticação nativo chamado “Basic Authetication”. Nesse método, o usuário deve se autenticar utilizando um ID de usuário e uma senha. O servidor compara a igualdade da senha informada, podendo autorizar o acesso mediante a validação das credenciais [Berners-Lee et al. 1996].

4.2 Protocolo Telnet

Telnet é um protocolo de nível de aplicação baseado no modelo cliente/servidor. Ele utiliza o TCP como protocolo de transporte e mantém a porta 23 para comunicação de dados. É utilizado para permitir a comunicação entre computadores ligados em uma rede local ou na internet. E tem como objetivo principal acessar um dispositivo de forma remota e o manipular. A RFC 854 descreve as especificações do protocolo.

Vários dispositivos de IoT, além da interface web, também utilizam o protocolo Telnet para configuração remota. Muitas vezes, as senhas de acesso via Telnet não podem ser alteradas.

Essa falha vem sendo utilizada por hackers, que tomam o controle de um grande número de dispositivos para executarem ataques DDoS (Distributed Denial of Service) ou ataque distribuído de negação de serviço [Angrishi 2017]. Angrishi [2017] descreve os registros de ataques a dispositivos IoT que exploram falhas em configuração do Telnet.

4.3 Protocolo FTP

FTP significa File Transfer Protocol (Protocolo de transferência de arquivos). Tem como finalidade principal o compartilhamento de arquivos na rede. A implementação do protocolo começou em 1971 nas máquinas do MIT (Massachussetts Institute of Technology), descrito no RFC 141 e, posteriormente, em 1973, após melhorias e inovações. A RFC 959 descreve o protocolo FTP.

Page 6: Comunicação entre Java e Arduino com Autenticação

O FTP baseia-se num modelo cliente/servidor, de forma que uma máquina envia comandos (cliente) e outra recebe esses comandos, processa e retorna uma determinada resposta (servidor). Na conexão FTP são abertos dois canais de comunicação: um canal para comando e outro para dados. O protocolo atua sobre a porta 20 e 21, e utiliza TCP como protocolo de transporte [Postel 1985].

A transmissão de dados do protocolo FTP padrão não possui nenhum tipo de criptografia, tornando-se vulnerável a ataques de espionagem. Assim, os protocolos com conexão segura foram criados, como o FTPS (com criptografia SSL) e STPS (com criptografia SSH).

4.4 Protocolo CoAP

O CoAP (Constrained Application Protocol) é um protocolo de comunicação desenvolvido pela IETF (Internet Engineering Task Force), visando à utilização em dispositivos computacionalmente limitados, como no caso do Arduino. Foi desenvolvido com o objetivo de ser uma alternativa ao HTTP para aplicações M2M (Machine-to-Machine). O termo M2M refere-se à comunicação entre máquinas (máquina para máquina). Ele é bastante utilizado em automação industrial e residencial. A RFC 7252 descreve as funcionalidades do protocolo [Shelby e Hartke 2014].

A estrutura do CoAP é parecida com o HTTP. Dá suporte à comunicação entre aplicativos seguindo o método solicitação/resposta. Entretanto, diferentemente do HTTP, o CoAP atende a alguns requisitos específicos para dispositivos com limitações computacionais. Por exemplo, baixa capacidade de processamento, pouco armazenamento e alta perda de dados na transmissão [Barreto, Viana and Andrade 2016].

A camada de transporte do CoAP comunica sobre a UDP. Diferentemente do HTTP, que utiliza a TCP. Para não haver perdas de dados na transmissão, o protocolo é implementado de forma otimizada, para tratar possíveis perdas de pacotes.

O CoAP usa um subconjunto de métodos HTTP, que são GET, POST, PUT e DELETE. Eles funcionam de maneira parecida, porém adaptados para redes LLN (Low-power and Lossy Networks), que são redes com baixa potência e altas taxas de perda de pacotes.

4.5 Protocolo MQTT

O protocolo MQTT (Message Queuing Telemetry Transport) foi inventado e desenvolvido pela IBM no final dos anos noventa. É um protocolo leve e simples, possui arquitetura de publish/subscribe (publicação/assinatura) e , assim como o CoAP, foi projetado para dispositivos com baixo poder de processamento e redes de baixa confiabilidade, que possuem perda de pacotes.

No entanto, o MQTT busca garantir a confiabilidade e a garantia de entrega dos dados, pois roda sobre a TCP. Diferentemente do CoAP e assemelhando-se ao HTTP neste aspecto.

O MQTT possui algumas características que o difere do HTTP: funciona de forma assíncrona, ou seja, o cliente não necessita da resposta do servidor; cabeçalhos mais leves e com menos informações, contribuindo para dispositivos mais limitados.

Page 7: Comunicação entre Java e Arduino com Autenticação

O MQTT também possui uma arquitetura diferente dos outros protocolos citados. A publicação/assinatura possui três tipos de atores [Waher 2015]:

• Publicador: conecta ao intermediário de mensagens e publica o conteúdo.

• Assinantes: conectam ao mesmo agente de mensagens e se inscrevem em conteúdo que eles estão interessados.

• Broker: recebe todas as mensagens dos clientes e, em seguida, roteia essas mensagens para os clientes de destino relevantes.

5 Estudo de Caso - Desenvolvimento do Cliente/Servidor

Nessa seção será demonstrada a implementação do método de autenticação no servidor Arduino e do cliente Java. Um método de autenticação não esta vinculado diretamente ao protocolo de comunicação utilizado, de modo que para o estudo de caso abordado poderia ser utilizado qualquer outro em nível de aplicação.

O protocolo de comunicação utilizado na implementação foi o HTTP, por ser o mais utilizado para prover serviços web [Rotta e Charao 2017], já possuir nativamente um método de autenticação, além de possuir um vasto material de pesquisa.

A programação do dispositivo Arduino foi feita em C/C++, utilizando a IDE oficial do Arduino para o servidor, que será uma central WiFi de hardware. O aplicativo cliente foi desenvolvido em Java para desktop multiplataforma.

A Figura 2 representa a arquitetura proposta no projeto. Além do cliente Java, um navegador de internet padrão também poderá ser utilizado como cliente para acessar o servidor Arduino. O Arduino estará conectado na mesma rede WiFi que o computador rodando o cliente Java.

Figura 2 – Arquitetura Cliente / Servidor

O método “Basic Authentication” é o sistema de autenticação mais comum do protocolo HTTP, e será abordado no desenvolvimento do estudo de caso. O esquema de autenticação funciona da seguinte forma: após a tentativa de acesso ao servidor, o mesmo responde ao cliente o código 401 (Unauthorized) e com um cabeçalho WWW-Authenticate, o cliente por sua vez envia um pedido (Request) com o cabeçalho de autenticação. As credenciais são transmitidas em Base64 seguindo o padrão “usuário:senha”. As credenciais são validadas pelo servidor e o cliente recebe a resposta

Page 8: Comunicação entre Java e Arduino com Autenticação

de acordo com a validação. A Figura 3 demonstra um diagrama da autenticação que permite o acesso do cliente ao servidor.

Figura 3 – diagrama autenticação

5.1 Ambiente

Foram utilizados os seguintes itens para desenvolvimento da aplicação:

• Plataforma Arduino UNO R3

• Módulo WiFi Shield R3

• Hardware: intel(r) core(tm) i5-2450m cpu @ 2.50ghz, Memória Ram: 4 GB

• IDE Arduino - Versão 1.8.5

• IDE Eclipse Java EE - Versão: Oxygen 4.7.0

Para o desenvolvimento do projeto, foi utilizada uma placa Arduino UNO. Para que esta consiga se conectar a uma rede sem fio, usou-se um módulo “Wifi Shield”. Este possibilita a conexão a qualquer rede do padrão Internet usando a especificação sem fio 802.11 (WiFi). O módulo é desenvolvido para um acoplamento perfeito no Arduino UNO.

O Cliente foi desenvolvido utilizando a IDE Eclipse Java, juntamente com a API Windowbuilder e HttpClient.

5.2 Interface da IDE Arduino

A IDE Arduino pode ser utilizada não só no modelo UNO, como também em qualquer outro. A utilização da IDE torna mais fácil o desenvolvimento e o envio do código para a placa. Ela é escrita em Java e é baseada em Processing. Pode ser utilizada nos sistemas operacionais Windows, Linux e Mac OS X [ARDUINO 2018b]. A interface gráfica da IDE é simples, como mostra a Figura 4.

Page 9: Comunicação entre Java e Arduino com Autenticação

Figura 4 – IDE Arduino 1.8.5

5.3 Implementação do Servidor

O Arduino utiliza a linguagem de programação C. A estrutura do código possui duas funções principais: setup() e loop(), como pode ser observado na Figura 2.

A função setup() é utilizada para iniciar e indicar variáveis e bibliotecas utilizadas, definir pinos de entrada e de saída. Assim que o Arduino é iniciado, essa função é executada uma vez.

No Bloco de código 1 são demonstradas as bibliotecas utilizadas, a declaração de variáveis que serão utilizadas para conexão a rede wifi, comandos para conexão à rede e a inicialização do servidor web definido na porta 80 após a conexão.

#include <SPI.h>

#include <WiFi.h>

char NomeWifi[] = "Nome da Rede wifi";

char Senha[] = "Senha da rede";

int status = WL_IDLE_STATUS;

WiFiServer server(80); // Definido Servidor na porta 80

Page 10: Comunicação entre Java e Arduino com Autenticação

String cabecalho;

void setup() {

Serial.begin(9600);

Serial.println("- Servidor Web Iniciado -");

while (status != WL_CONNECTED) {

Serial.print("Conectando na Rede: ");

Serial.println(NomeWifi);

status = WiFi.begin(NomeWifi, Senha);

delay(1000);

}

mostraStatus();

server.begin();

} // fim setup

Bloco de código 1

A função mostraStatus() tem como finalidade retornar qual o status da conexão, o nome da rede a qual o Arduino se conectou e qual o IP que está recebendo, como mostra o Bloco de código 2. A função é declarada após a função loop().

void mostraStatus() {

Serial.println(" __________ STATUS DA REDE __________ ");

Serial.print("Rede Conectada: ");

Serial.println(WiFi.SSID());

IPAddress ip = WiFi.localIP();

Serial.print("IP: ");

Serial.println(ip);

Serial.println("____________________________________");

};

Bloco de código 2

A função loop() é executada continuamente. Quando chega ao fim, ela retorna ao início da função, fazendo precisamente o que o próprio nome diz.

Uma vez executado a função setup(), conectado na rede wifi e iniciado o servidor à porta 80, o processador executa a função loop(). O protocolo HTTP, por padrão, utiliza a porta 80 para comunicação de dados. A utilização dessa porta em

Page 11: Comunicação entre Java e Arduino com Autenticação

específico não é obrigatória, podendo ser configurada de acordo as necessidades do desenvolvedor. Porém, deve-se levar em consideração que, realizando essa alteração, a porta utilizada deve ser indicada no acesso para que o cliente possa se conectar ao servidor.

O objetivo da função loop() é identificar a requisição de um novo cliente que se conecta ao servidor, ler o cabeçalho da requisição, validar a autenticação e retornar um código ao cliente: 200, caso as credenciais forem corretas, ou 401, se incorretas. .

Foi utilizado o método de Basic Authentication presente no protocolo HTTP, devido a sua facilidade de uso. Os navegadores atuais utilizam a conversão para base64, a fim de codificar o usuário e senha.

O Bloco de código 3 demonstra como a validação foi implementada.

void loop() {

WiFiClient cliente = server.available();

if (cliente) {

Serial.println("- Novo Cliente -");

Serial.println(" ");

boolean linhaVazia = true;

while (cliente.connected()) {

if (cliente.available()) {

char c = cliente.read();

cabecalho += c;

if (c == '\n' && linhaVazia) {

Serial.println("Cabeçalho = ");

Serial.print(cabecalho);

if (cabecalho.indexOf("dGVzdGU6dGVzdGU=") >= 0) //senha em base64

cliente.println("HTTP/1.1 200 OK");

cliente.println("Content-Type: text/html");

cliente.println("Connection: close");

cliente.println();

if (cabecalho.indexOf("GET / HTTP/1.1") >= 0) {

cliente.println("<!DOCTYPE HTML>");

cliente.println("<html>");

Page 12: Comunicação entre Java e Arduino com Autenticação

cliente.println("Senha OK - Acesso Permitido!");

cliente.println("</html>");

} else {

cliente.println("<!DOCTYPE HTML>");

cliente.println("<html>");

cliente.println("Acesso Permitido!");

cliente.println("</html>");

}

} else {

cliente.println("HTTP/1.1 401 Unauthorized");

cliente.println("WWW-Authenticate: Basic realm=\"Secure\"");

cliente.println("Content-Type: text/html");

cliente.println();

cliente.println("<html> <h2>bt cancel - login cancelado</h2></html>");

}

cabecalho = "";

break;

}

if (c == '\n') {

linhaVazia = true;

}

else if (c != '\r') {

linhaVazia = false;

}

}

}

delay(10);

cliente.stop();

Serial.println(" - Cliente Disconectado - ");

Serial.println("____________________________________");

Serial.println(" ");

}

} // fim loop

Bloco de código 3

Page 13: Comunicação entre Java e Arduino com Autenticação

Após o a declaração das bibliotecas e das funções setup() e loop(), o código fonte já pode ser enviado para execução, com o auxilio da IDE Arduino. Utilizando o Monitor Serial, é possível verificar as novas conexões que o servidor recebe, bem como as informações de IP e de rede conectados. Todas as mensagens de conexão de novos clientes e cabeçalho são impressas no monitor serial, como pode ser visto na Figura 5.

Figura 5 – Monitor Serial

Os testes de conexão e autenticação foram realizados através do navegador Google Chrome. Após requisitar o acesso ao IP do servidor, o navegador solicitará o preenchimento dos campos de Nome de usuário e Senha, como mostra a Figura 6.

Figura 6 – Acesso via navegador Google Chrome

Page 14: Comunicação entre Java e Arduino com Autenticação

5.4 Desenvolvimento do Cliente

O Cliente Java proposto no Artigo tem como objetivo observar a versatilidade do protocolo HTTP. Apresentam uma das possíveis formas de autenticação que o protocolo fornece, bem como demonstram que a utilização do protocolo possibilita a criação de dispositivos IoT acessíveis via navegador ou cliente dedicado, tornando-o assim multi-plataforma.

Foi utilizado o PlugIn WindowBuilder para a fabricação da interface gráfica do cliente. Essa interface conta com os seguintes componentes:

• Servidor: em que o usuário insere o IP a qual pretende se conectar;

• Usuário e Senha;

• Status: tem como finalidade informar ao usuário se a autenticação foi concluída com sucesso ou não;

• Botão Conectar;

• Botão Sair – Encerra o Cliente.

A Figura 7 mostra a disposição dos componentes.

Figura 7 – Tela Cliente Java

Ao clicar no botão “Conectar”, o cliente efetua uma requisição HTTP. Para isso, foi utilizado o PlugIn HttpClient, fornecido pela Apache. O Projeto Apache HttpComponents (ao qual o HttpClient faz parte) é responsável por criar e manter um conjunto de ferramentas de componentes Java focado em HTTP. Foi adicionado um Evento ao clique do botão “Conectar”. No Bloco de Código 4 é demonstrado toda a ação do Evento.

Page 15: Comunicação entre Java e Arduino com Autenticação

As variáveis “usuario”, “senha” e “servidor” foram utilizadas para fornecer as informações necessárias para o método de conexão. A porta de conexão já foi pré- estabelecida, mantida a padrão, utilizada pelo protocolo HTTP.

Foram tratadas as possíveis respostas do servidor: 200 - servidor valida as credenciais e autoriza a o acesso; 401 – o acesso é negado devido à não-conformidade nas credenciais; e Tempo de conexão excedido – em que o servidor demora para responder à requisição do cliente.

JButton btnConectar = new JButton("Conectar");

btnConectar.addActionListener(new ActionListener() { // 1

public void actionPerformed(ActionEvent arg0) { // 2

String usuario = tbusuario.getText();

String senha = tbsenha.getText();

String servidor = tbservidor.getText();

CredentialsProvider credenciais = new BasicCredentialsProvider();

credenciais.setCredentials(new AuthScope(servidor, 80),

new UsernamePasswordCredentials(usuario, senha));

CloseableHttpClient httpclient = HttpClients.custom().setDefaultCredentialsProvider(credenciais)

.build();

try {

HttpGet httpget = new HttpGet("http://" + servidor);

System.out.println("Executando solicitação: " + httpget.getRequestLine());

CloseableHttpResponse response = httpclient.execute(httpget);

try {

System.out.println("----------------------------------------");

System.out.println("response.getStatusLine(): ");

System.out.println(response.getStatusLine());

if (response.getStatusLine().getStatusCode() == 200) {

tbStatus.setText("200 - Acesso permitido!");

}

else if (response.getStatusLine().getStatusCode() == 401) {

tbStatus.setText("401 - Acesso Negado!");

Page 16: Comunicação entre Java e Arduino com Autenticação

}

} finally {

response.close();

}

} catch (ConnectException e2) {

e2.printStackTrace();

tbStatus.setText("Tempo de Conexão Excedido");

} catch (ClientProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

httpclient.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}// 2

} // 1

);

Bloco de Código 4

Assim como na autenticação através do navegador, o servidor responde ao cliente se o acesso foi permitido ou não, ou se o tempo de conexão foi excedido. As informações são impressas no campo “Status”. Na Figura 8 podem ser observadas as respostas do cliente.

Page 17: Comunicação entre Java e Arduino com Autenticação

Figura 8 – Status de Conexão

A figura 8 demonstra que o servidor responde às requisições enviadas pelo cliente, valida as credenciais e retorna uma resposta a ele. Este por sua vez, informa ao usuário a mensagem recebida do servidor.

5.5 Resultados

A partir da análise do referencial teórico a cerca de novas tecnologias voltadas para o universo de dispositivos IoT foi possível constatar que existem demandas em diversos setores, isso impulsiona o interesse de desenvolvedores em buscar inovações que atendem a essas demandas. A criação de novos protocolos voltados a dispositivos de baixo desempenho como o Arduino é um exemplo disso.

Juntamente com o surgimento dessas novas tecnologias ouve também o aumento de ataques a dispositivos IoT, gerando a necessidade de implementação de métodos de segurança.

Observando os resultados obtidos no desenvolvimento do cliente/servidor e nas tentativas de acesso utilizando tanto o navegador quanto o cliente Java, é possível verificar que a utilização do método de autenticação abordado possibilita o controle de acessos não autorizados ao sistema. Portanto sua aplicação pode ser considerada válida.

A Utilização do método “Basic Authentication” pode ser vantajosa quanto sua simplicidade de desenvolvimento e atuação de forma precisa observado no desenvolvimento. Contudo nenhum método de segurança pode ser considerado livre de falhas e sua aplicação pode ser levada a prova. A transmissão de dados não sigilosa entre cliente e servidor pode ser um aspecto decisivo na escolha do método de autenticação.

Page 18: Comunicação entre Java e Arduino com Autenticação

6 Conclusão

A segurança para dispositivos IoT tem sido objeto de grande interesse do meio científico. Com um aumento das pesquisas tecnológicas voltadas para a área e o estudo dos protocolos de comunicação via internet, abordados neste artigo, foi possível observar que cada um possui suas particularidades, características específicas e limitações. Sendo assim, ao contrário do que se esperava, nenhum dos protocolos pode ser considerado melhor. Para cada projeto é preciso uma análise do objetivo-fim e, a partir desta, pode-se definir qual protocolo atende melhor aos requisitos.

Mediante ao exposto no desenvolvimento do cliente e servidor, concluiu-se que a utilização do método de autenticação básica do protocolo HTTP possibilita um desenvolvimento simples e eficaz. Ele cumpre com o objetivo proposto pela tecnologia utilizada, que seria uma possível maneira de evitar acessos não autorizados em dispositivos Arduino.

Para que fosse possível a realização desse estudo, foi necessária a pesquisa bibliográfica acerca dos protocolos que são de uso específico e não tão usual, a compreensão da estrutura de requisição do protocolo HTTP, assim como o método de autenticação definido como Basic Authenticantion. Além disso, foi indubitável conhecer mais sobre o contexto do Arduino, sua IDE, que não possui tantos recursos de abstração quanto o Eclipse e outras IDE’S no mercado. Também foi necessário o contato com uma linguagem de programação de baixo nível.

Como extensão deste artigo para trabalhos futuros, é sugerido o estudo dos métodos de autenticação utilizando outros protocolos, assim como a sua viabilidade.

7 Referências

Angrishi, K. (feb 2017). Turning Internet of Things(IoT) into Internet of Vulnerabilities (IoV) : IoT Botnets.

Arduino (2018). What is Arduino? https://www.arduino.cc/en/Guide/Introduction, [accessed on Apr 27].

ARDUINO (2018a). arduino uno rev3. http://arduino.cc/en/Main/arduinoBoardUno.

ARDUINO (2018b). Download the Arduino IDE. https://www.arduino.cc/en/Main/Software.

Berners-Lee, T., Fielding, R. and Frystyk, H. (1996). Hypertext Transfer Protocol -- HTTP/1.0. p. 1–60.

Brezolin, F. L. (2017). Proposição de um Sistema de Autenticação Simplificado e Interativo com Dispositivo IoT.

Felipe Mota Barreto, Windson Viana, R. M. de C. and Andrade (2016). Um mecanismo de descoberta sensível ao contexto de objetos inteligentes em Internet das Coisas. . Anais do XXII Simpósio Brasileiro de Sistemas Multimídia e Web (Vol. 2). http://www.lbd.dcc.ufmg.br/colecoes/wtdwebmedia/2016/001.pdf.

Page 19: Comunicação entre Java e Arduino com Autenticação

Giovanni Rotta, Andrea Charao, M. D. (2017). Um Estudo sobre Protocolos de Comunicação para Ambientes de Internet das Coisas. http://www.lbd.dcc.ufmg.br/colecoes/erad/2017/091.pdf, [accessed on Apr 20].

NIC.Br (2017). Programa do CGI.br incentiva adoção de boas práticas de segurança entre sistemas autônomos. . http://www.nic.br/noticia/releases/programa-do-cgi-br-incentiva-adocao-de-boas-praticas-de-seguranca-entre-sistemas-autonomos/.

Panetta, K. (2016). Internet of Things. https://www.gartner.com/smarterwithgartner/7-technologies-underpin-the-hype-cycle-for-the-internet-of-things-2016/, [accessed on Apr 30].

Postel, J. (1980). user datagram protocol. https://tools.ietf.org/html/rfc768, [accessed on Apr 20].

Postel, J. (1981). transmission control protocol. https://tools.ietf.org/html/rfc793, [accessed on Apr 20].

Postel, J. (1985). file transfer protocol. https://tools.ietf.org/html/rfc959, [accessed on Apr 20].

RNP (2015). A história por trás dos 20 anos da internet comercial no Brasil. https://www.rnp.br/destaques/historia-por-tras-20-anos-internet-comercial-brasil, [accessed on May 1].

Souza, F. (2013). Arduino UNO. https://www.embarcados.com.br/arduino-uno/, [accessed on Apr 20].

Waher, P. (2015). Learning Internet of Things.

Z. Shelby, K. Hartke, C. B. (2014). The Constrained Application Protocol (CoAP). https://tools.ietf.org/html/rfc7252, [accessed on Apr 20].