Segurança da informação para IoT

Este post faz parte da série Segurança da Informação. Leia também os outros posts da série:

Introdução

 

Internet das Coisas (IoT) está crescendo numa velocidade incrível no mundo inteiro, muito devido ao movimento Maker, que também está crescendo diante das plataformas de desenvolvimento, como Arduino, ESP e relacionados. Apesar da IoT estar revolucionando o mundo com os mais diversos projetos e simplicidade proporcionados, também está causando perigo aos dados e às pessoas, já que a segurança não está andando alinhada ao desenvolvimento de novos produtos.

 

Iremos abordar neste material o básico relacionado à encriptação com foco em sigilo de dados, mostrando dois algoritmos criptográficos importantes e que podem ser facilmente integrados ao projeto com o uso de uma biblioteca chamada mbedTLS. O que será apresentado é uma introdução ao assunto e há muito mais a ser estudado.

 

 

O que é criptografia?

 

Criptografia pode ser entendida como um conjunto de técnicas para cifrar uma mensagem, a fim de torná-la ilegível para quem não tem acesso à chave (confidencialidade). Também é capaz de garantir, em alguns casos, a autenticidade da informação com uma assinatura digital feita por algoritmos Hash. Em cenários militares, criminosos, diplomáticos e etc, criptografia é extremamente importante para se manter os dados seguros de "bisbilhoteiros", uma vez que, por exemplo, se um país em guerra interceptar uma mensagem de ataque, pode facilmente criar uma emboscada e iniciar um contra-ataque.

 

Em IoT, a gama de dispositivos das mais diferentes finalidades é gigantesca e alguns desses dispositivos podem tratar e transmitir dados sensíveis, como, por exemplo, senhas e informações sigilosas. Então, usamos desde codificações, criptografias e até canais seguros para transmissão de dados a um banco de dados ou Peer-To-Peer (P2P). Além disso, precisamos garantir que a informação recebida é de uma fonte confiável, logo, precisamos de mais ferramentas como, por exemplo, Hash’s e Rolling code.

 

Vamos analisar agora alguns aspectos e conceitos relacionados à criptografia.

 

  • Confidencialidade: propriedade que limita o acesso à informação tão somente às entidades legítimas, ou seja, àquelas autorizadas pelo proprietário da informação;
  • Integridade: propriedade que garante que a informação manipulada mantenha todas as características originais estabelecidas pelo proprietário da informação, incluindo controle de mudanças e garantia do seu ciclo de vida (corrente, intermediária e permanente);
  • Disponibilidade: propriedade que garante que a informação esteja sempre disponível para o uso legítimo, ou seja, por aqueles usuários autorizados pelo proprietário da informação;
  • Autenticidade: propriedade que garante que a informação é proveniente da fonte anunciada e que não foi alvo de mutações ao longo de um processo;
  • Irretratabilidade: propriedade que garante a impossibilidade de negar a autoria em relação a uma transação anteriormente feita;
  • Conformidade: propriedade que garante que o sistema deve seguir as leis e regulamentos associados a este tipo de processo.

 

Exemplos na prática:

 

Ciclos/Byte de vários algoritmos criptográficos no MbedTLS.
Figura 1 – (Encrypt) Ciclos/Byte de vários algoritmos criptográficos no MbedTLS.

 

Criptografia assimétrica: são criptografias baseadas em algoritmos que requerem duas chaves, uma delas sendo secreta e a outra delas sendo pública. As duas partes desse par de chaves são matematicamente ligadas. A chave pública é usada, por exemplo, para encriptar a mensagem ou para verificar uma assinatura digital. Já a chave privada é usada para a operação oposta, nesses exemplos para decriptar uma informação previamente criptografada ou para criar uma assinatura digital.

 

Criptografia simétrica: são criptografias baseadas em algoritmos que requerem uma única chave, que é usada tanto para as operações de cifragem como a de decifragem. A operação de chave simétrica é mais simples pois existe uma única chave entre as operações. A chave, na prática, representa um segredo compartilhado entre duas ou mais partes, que pode ser usada para manter um canal confidencial de informação.

 

A criptografia assimétrica possui custo computacional maior que a simétrica e, por isso, não é utilizada durante todo o tempo em uma comunicação segura. Normalmente é usada para a transmissão da chave de sessão para um algoritmo simétrico. Assinatura digital é uma outra aplicação relevante da criptografia de chaves públicas. Em algumas tabelas de benchmark, RSA-4096 pode ser ~350.000 vezes mais lenta que AES-256 (ECB), então podemos perceber que o uso dela fica quase restrito a lugares com alto poder computacional. Em microcontroladores o poder computacional é normalmente bem pequeno, entretanto, no cenário atual, é indispensável o uso da criptografia assimétrica, estando presente em boa parte das comunicações seguras.

 

Apesar dessas criptografias serem para usos diferentes, pode ser interessante fazer essa comparação de velocidade. Outro ponto interessante a se verificar é quanto de FLASH é utilizada, por exemplo, na arquitetura Xtensa (presente nos módulos ESP8266 e ESP32) para efetuar o processo com sucesso.

 

  • AES: FLASH: ~12KB
  • RC4: FLASH: ~3KB
  • RSA: FLASH: ~28KB
  • SHA: FLASH: ~4KB
  • ECDH: FLASH: ~8KB

 

Você pode estar se perguntando: "Quem usa criptografia assimétrica?". Um exemplo clássico são sites marcados com HTTPS (SSL/TLS), que fazem a transmissão de dados iniciais por criptografia assimétrica e, após ser estabelecida uma conexão, é usada criptografia simétrica. O próprio WhatsApp faz uso de vários algoritmos, como o AES-256, para que nossas conversas fiquem seguras de "curiosos" e crackers.

 

Segurança da informação - Sniffer capturando dados UDP desprotegidos pela rede.
Figura 2 – Sniffer capturando dados UDP desprotegidos pela rede.

 

 

Criptografia RC4

 

 

Ciclo do algoritmo RC4
Figura 3 – Ciclo do algoritmo RC4.

 

RC4, também conhecido como Arc4, é a criptografia de fluxo (stream) mais usada no mundo. É mais leve e rápida que AES, mas pode ser menos segura (é considerada insegura para várias aplicações). Um algoritmo de cifração de fluxo (stream) é interessante onde as mensagens a serem cifradas variam o seu tamanho. Visto que cada bit do input (plaintext) gera um bit no output (ciphertext), então ao cifrar uma letra, teremos uma letra de saída. Assim, temos uma maior velocidade ao enviar poucos caracteres do que enviar blocos inteiros.

 

Vamos usá-la em conjunto com o ESP32 e a Arduino IDE. O ESP32 é o microcontrolador sucessor do famoso ESP8266, ótimo para IoT por ser barato e com um bom hardware que suporta, inclusive, aceleração de hardware para criptografias como RSA, AES e SHA.

 

Código de teste

 

 

Código e saída de dados do teste.
Figura 4 – Código e saída de dados do teste.

 

Resultados da encriptação

 

A chave a ser usada deve ser aleatória e com períodos grandes. Não use chaves simples e sequenciais como a utilizada no exemplo, feito apenas para demonstração. Também é interessante fazer o uso de True Random Number Generator (TRGN), que faz o uso de ruídos externos para gerar valores aleatórios e imprevisíveis. No ESP32 há TRGN, que capta ruídos da antena WiFi/Bluetooth e gera valores aleatórios UINT32.

 

Após a encriptação, será gerado um criptograma (ciphertext) no serial monitor da respectiva mensagem. Esse ciphertext é do mesmo tamanho que a mensagem de input.

 

Chave usada: “1234567890123456”

Plaintext: “Seguranca da informacao. Embarcados”

Ciphertext: “73 D5 F4 C4 56 84 A2 EA 72 E1 7B 85 A8 9D B1 9F CA 78 56 12 8C BF A0 A8 74 22 99 C3 81 E6 9 23 82 F8 F8”

 

Podemos observar que a saída é totalmente diferente da entrada, mostrando o conceito de criptografia/codificação para sigilo de dados. Vale lembrar que apenas pessoas com a mesma chave podem voltar à mensagem original. Então, mantenha sua chave em segredo e disponibilize-a apenas para pessoas que possam ler.

 

Conferindo o resultado

 

Vamos analisar com uma ferramenta externa ao sistema (ESP32) o criptograma e ver se a mensagem retorna ao conteúdo original com a chave usada.

 

É preciso apenas incluir a chave usada anteriormente para encriptação e também o texto HEX a ser desencriptado. A mensagem resultante é informada no canto inferior direito.

 

Desencriptação com chave correta do criptograma gerado pelo ESP32.
Figura 5 – Desencriptação com chave correta do criptograma gerado pelo ESP32.

 

Obs: O site não aceitou números menores que 10 sem se adicionar 0 à frente. Antes estava “9” e foi necessário mudar para “09”. Faça isso com todos números menores que 10.

 

Podemos ver que a mensagem retornada é exatamente a que foi encriptada!

 

Agora, iremos alterar um único caractere da chave, veja o que acontece:

 

Desencriptação com chave errada do criptograma gerado pelo ESP32
Figura 6 – Desencriptação com chave errada do criptograma gerado pelo ESP32.

 

Chave usada: “1234567890123457”

Plaintext (Esperado): “Seguranca da informacao. Embarcados”

Plaintext (Retornado): “¼$Îà..Þ..múÓÀL%.öº-À.+-(Æ+.ß=OG.á.i”

 

Podemos observar claramente que um mínimo erro na chave gera uma mensagem totalmente diferente do esperado, impossibilitando o uso de outras chaves e deixando mais claro que você deve proteger a sua.

 

No próximo artigo deste material será mostrada a criptografia AES, uma criptografia de blocos que é geralmente mais segura e confiável que RC4 e, por ser em blocos, nos permite adicionar sistemas de verificações em relação a mensagens no sistema e aceitar apenas um tamanho fixo de mensagem.

Outros artigos da série

Segurança da Informação - Criptografia AES >>
Este post faz da série Segurança da Informação. Leia também os outros posts da série:

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

José Morais
Estudante de Engenharia da Computação pela USC, pretende se aprimorar e fazer a diferença nesta imensa área da tecnologia. Apaixonado por IoT, sistemas embarcados, microcontroladores e integração da computação nos mais diversos fins práticos e didáticos.