Intel Edison - Princípios básicos de comunicação segura via Socket TCP usando OpenSSL e AES 256 em C

OpenSSL

Com a ascensão de dispositivos conectados à Internet e alinhados ao conceito de IoT, informação virou uma moeda, muitas vezes a mais valiosa das moedas. Nisso, um tópico sempre é revisitado: segurança. E é com razão que isto deve ser sempre destacado, afinal como os dispositivos estão cada vez mais dependentes da Internet, nada mais justo do que protegê-los contra invasões e proteger os dados por eles trafegados.

 

Sendo assim, este artigo mostrará como fazer um projeto, em linguagem C (no Linux), no SBC Intel Edison, que permita comunicação segura via socket TCP (com um destinatário em rede local ou Internet). A segurança é garantida pela encriptação simétrica do payload em AES 256 (modo CBC), através da implementação nativa do algoritmo no OpenSSL. 

 

 

Material necessário

 

Para reproduzir este projeto, será necessário o seguinte material:

  • Uma SBC (Single-Board Computer) Intel Edison (com acesso à rede local ou Internet);
  • Um computador remoto com Linux e acesso à Internet ou rede local.
    Este computador remoto pode estar tanto em rede local quanto na Internet e pode ser outra SBC, uma VPS ou até mesmo um computador pessoal com Linux. Caso for utilizar uma VPS, recomendo criar uma VPS na DigitalOcean. Trata-se de uma empresa que disponibiliza VPS a um preço muito acessível e possui um serviço muito bom.

 

 

Princípios básicos: segurança na comunicação

 

A comunicação com segurança pode ser definida como a troca de mensagens por um canal (Internet, via sockets TCP, por exemplo) de forma que as mensagens trocadas estão codificadas em um padrão conhecido por quem estiver envolvido na comunicação (em essência, conhecido SOMENTE por quem está envolvido nesta comunicação). Quem vai enviar uma mensagem a codifica e quem recebe deve decodificar a mensagem recebida antes de utiliza-la / interpreta-la. A esta codificação, dá-se o nome de criptografia.

 

Em resumo, criptografar uma mensagem consiste em codificá-la com base em um algoritmo e uma chave, de forma que somente quem tiver exatamente a chave e seguir exatamente o algoritmo utilizado na codificação conseguirá recuperar a mensagem original. Aqui, cabe uma diferenciação: se a chave a ser usada deve ser idêntica no emissor e no receptor, trata-se de uma criptografia simétrica. Já se a chave a ser utilizada é diferente em ambos os lados (sistema de chave pública e chave privada, por exemplo), trata-se de uma criptografia assimétrica.

 

Embora transparente para muitos dos usuários, a criptografia está presente em basicamente tudo que nos rodeia, desde uma conversa via aplicativo de mensagem instantânea até uma transação bancária.

 

Observe o diagrama abaixo:

 

Diagrama de uma transmissão segura / criptografada usando OpenSSL
Figura 1 - Diagrama de uma transmissão segura / criptografada

 

No caso do projeto aqui abordado, é utilizada criptografia simétrica e o algoritmo de criptografia é obtido diretamente do OpenSSL.

 

 

OpenSSL, o que é?

 

O OpenSSL consiste em um conjunto de ferramentas open-source para fins de segurança. Possui suporte a TLS (Transport Layer Security), SSL (Secure Socket Layer) e a um grande conjunto de criptografias (algoritmos de criptografia já consagrados) e hashs utilizados no mercado. Dentre suas vantagens de uso se destacam: total compatibilidade com Linux (desconheço uma distribuição que não permita compatibilidade), licença Apache-style (ou seja, você pode usar para fins de estudo ou comerciais sem problemas) e ser muito leve (o que encoraja seu uso, mesmo em aplicações mais críticas e em sistemas com hardware mais modesto).

 

Além disso, por possuir integração com praticamente quaisquer linguagens de programação em ambiente Linux, seu uso em projetos comerciais ou estudantis é massivo.

 

 

Projeto - descrição

 

O projeto aqui desenvolvido consiste em uma comunicação via Socket TCP entre dois sistemas Linux, onde o payload (mensagem efetivamente enviada) desta comunicação é criptografada (neste caso, em AES 256 CBC).

 

Como tem fins didáticos, o projeto possui funcionalidade bem simples: o programa com socket client se conecta ao socket server e envia uma mensagem criptografada (criptografia simétrica). Esta mensagem é descriptografada no programa com socket server, é levemente modificada, criptografada (criptografia simétrica) e é enviada ao socket client. Ao receber a mensagem, o programa com socket client descriptografa a mensagem e a exibe na tela. Após isso, a conexão entre socket server e client é encerrada. Observe o diagrama de operação do projeto / demonstração.

 

Diagrama do funcionamento do projeto / demonstração deste artigo
Figura 2 - Diagrama do funcionamento do projeto / demonstração deste artigo

 

Desta forma, a partir deste projeto, pode-se elaborar outros mais complexos, uma vez que a comunicação segura via Socket está aqui validada.

 

 

Projeto - criptografia utilizada

 

Para o projeto em questão, será utilizada a criptografia AES 256 bits, no modo CBC. Trata-se de uma criptografia difícil de ser quebrada.

 

No quesito chave, este tipo de criptografia possui uma "chave composta", ou seja, possui uma Key e um IV (vetor de inicialização), sendo que o Key possui 32 bytes (= 256 bits) e o IV possui 16 bytes (= 128 bits). Desta maneira, a segurança é aumentada, uma vez que IV e Key são desvinculados (não precisam ter relação um com o outro). Isto permite fazer várias "táticas" de criptografia, incluindo o uso de números pseudo-aleatórios (possuem lei de formação em algo que somente emissor e receptor conhecem, parecendo aleatórios para quem não está inserido na comunicação) para o IV.

 

Para fins didáticos, este projeto possui Key e IV fixos. Porém, quanto mais criatividade em cima disso for aplicada, mais segura será a criptografia. 

 

Para mais informações sobre este tipo de criptografia, veja este link.

 

 

Projeto - código-fonte

 

O código-fonte do projeto pode ser visto no GitHub no seguinte link:

https://github.com/phfbertoleti/SocketTCPSeguroEmLinux

 

Importante:

  • A imagem padrão da Intel Edison já vem com OpenSSL (incluindo as bibliotecas de desenvolvimento) instaladas por padrão. Se você quiser utilizar este projeto em outra plataforma / distribuição / SBC, certifique-se de instalar o OpenSSL e suas bibliotecas de desenvolvimento;
  • A Key e o IV estão em arquivos texto. Conforme pode ser observado no código, esses devem ser guardados em uma pasta a qual somente o usuário root tem acesso.  Isso é feito pois, se a Key e o IV fossem colocados diretamente nos códigos-fonte, seria relativamente simples para alguém que deseja interceptar a comunicação recuperar estes dados e acabar com a segurança da comunicação;
  • Os arquivos com Key e IV podem, nos dois sistemas, estar armazenados em pastas diferentes, porém nunca podem ter conteúdos diferentes. Caso isso ocorra, a criptografia e decriptografia dos dados não poderá ser feita.

 

 

Projeto em ação!

 

Veja abaixo um vídeo do projeto em ação. Nele, utilizei uma Intel Edison para rodar a aplicação com socket client e uma VPS (rodando Ubuntu 16.04LTS) para rodar a aplicação com socket server.

 

 

 

Referências

 

 

 

Agradecimentos

 

Agradeço aos meus amigos e articulistas Felipe Neves e Cleiton Bueno por toda a ajuda dada sobre o assunto de criptografia.

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.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Pedro Bertoleti
Sou engenheiro eletricista formado pela Faculdade de Engenharia de Guaratinguetá (FEG - UNESP) e trabalho com Android embarcado em Campinas-SP. Curioso e viciado em tecnologia, sempre busco me aprimorar na área de sistemas embarcados (modalidades bare-metal, RTOS, Linux embarcado e Android embarcado).Para mais informações, acesse minha página no Facebook:https://www.facebook.com/pbertoleti

Deixe um comentário

avatar
 
  Notificações  
Notificar