CSI-ES-2324/Projs/PD1
2024-04-23 11:18:53 +01:00
..
certs [PD1] Created another CA, Server and Client for testing 2024-04-19 02:20:04 +01:00
cmd [PD1] Generic networking server and client implemented 2024-04-17 14:09:42 +01:00
internal Merge branch 'main' of ssh://git.olympuslab.net:522/Uni/CSI-ES-2324 2024-04-23 11:15:43 +01:00
.gitignore Initial commit 2024-02-19 10:37:29 +00:00
.ignore [PD1] small changes 2024-04-23 11:12:18 +01:00
go.mod [PD1] Fixed almost everything 2024-04-19 23:59:26 +01:00
go.sum [PD1] Fixed almost everything 2024-04-19 23:59:26 +01:00
ltex.dictionary.en-US.txt [PD1] restructure 2024-04-16 12:23:00 +01:00
README.md [PD1] - Topics for Report 2024-04-23 11:18:53 +01:00
server.db [PD1] small changes 2024-04-23 11:12:18 +01:00
tokefile.toml [PD1] small changes 2024-04-23 11:12:18 +01:00

Relatório do Projeto de Desenvolvimento 1

Introdução

Adicionar uma historia a justificar a existencia do serviço

O nosso principal objetivo com este projeto foi consolidar os conceitos lecionados assim como simular interações com um cliente/entidade que nos "encomendou" o serviço, procurando satisfazer as necessidades e requisitos. O projeto consiste num sistema Cliente/Servidor, em que a aplicação cliente seria executada por cada utilizador que queria aceder ao serviço de mensagens, e o servidor seria responsável por responder aos pedidos dos utilizadores e armezenar de forma segura a informação. Para tal, o sistema deveria permitir a troca de mensagens entre os utilizadores, garantindo a autenticidade das mensagens. Algumas notas sobre o projeto:

  • Optamos por escolher Golang como linguagem visando uma implementação mais eficiente, robusta e segura ao nível de concorrência.
  • Implementamos algumas funcionalidades extra, como o armazenamento dos dados no servidor numa base de dados sqlite3 Nas secções seguintes iremos detalhar cada componente do sistema, bem como as funcionalidades implementadas.

Arquitetura do Sistema

Neste projeto, a arquitetura do sistema é composta por 2 componentes principais:

  • Cliente: é a aplicação que cada utilizador executa para interagir com o servidor. O cliente é responsável por enviar mensagens para o servidor e receber mensagens de outros utilizadores (pelo servidor).
  • Servidor: é a aplicação que recebe os pedidos dos clientes, processa-os e responde de acordo. O servidor é responsável por armazenar as mensagens dos utilizadores e garantir a autenticidade das mensagens.

Crypto

Justificar a necessidade de cifrar e autenticaçao e explicar melhor o processo de encryption com o diagrama

É importante destacar que, para garantir a segurança e integridade das mensagens, implementamos um protocolo de comunicação seguro. Este protocolo utiliza tanto criptografia simétrica quanto assimétrica. As mensagens são cifradas com a chave pública do destinatário para garantir a confidencialidade, enquanto são assinadas com a chave privada do emissor para autenticidade. Dessa forma, asseguramos que as mensagens sejam protegidas contra acessos não autorizados e que sua origem possa ser verificada.

Networking

O canal de comunicação estabelecido entre o cliente e o servidor nesta implementação garante uma troca de dados segura e criptografada utilizando o protocolo TLS (Transport Layer Security). Ambos, cliente e servidor, empregam configurações TLS para cifrar os dados durante a transmissão, assegurando confidencialidade e integridade. Durante o handshake TLS, o servidor valida o certificado do cliente para verificar sua autenticidade, prevenindo acessos não autorizados. Este mecanismo robusto de segurança protege o canal de comunicação contra escutas, adulterações e ataques do tipo "man in the middle", garantindo uma troca de informações segura e confiável entre o cliente e o servidor.

Protocolo de Comunicação

O package protocol.go define um conjunto de estruturas e funções que representam os diferentes tipos de pacotes que podem ser transmitidos entre o cliente e o servidor. Cada tipo de pacote é representado por uma constante PacketType, que indica a natureza da informação contida no pacote através de uma flag.

As estruturas de dados definidas, como GetUserCert, GetUnreadMsgsInfo, GetMsg, SendMsg, AnswerGetUserCert, AnswerGetUnreadMsgsInfo e AnswerGetMsg, descrevem os formatos específicos de cada tipo de pacote a ser enviado e recebido. Cada estrutura contém os campos necessários para armazenar e representar os dados associados a cada tipo de pacote.

Além disso, foram implementadas funções auxiliares para criar instâncias de cada tipo de pacote, como NewGetUserCert, NewGetUnreadMsgsInfo, NewGetMsg, NewSendMsg, NewAnswerGetUserCert, NewAnswerGetUnreadMsgsInfo e NewAnswerGetMsg. Estas funções facilitam a criação de pacotes com os dados necessários de forma estruturada.

Para facilitar a serialização e desserialização dos pacotes em formato JSON, foram implementadas funções Unmarshal específicas para cada tipo de pacote. Estas funções convertem os dados do pacote entre o formato JSON e as estruturas de dados correspondentes, permitindo a comunicação eficiente entre o cliente e o servidor.

Este package serve como uma camada de abstração que facilita a comunicação entre os componentes cliente e servidor, garantindo que os dados sejam transmitidos de forma estruturada e padronizada, facilitando o desenvolvimento, manutenção e expansão do sistema de comunicação.

Diagramas

Server

Data Store

Verificaçao de dados ? Proteçao contra ataques a base de dados

Client

Commands used to generate the key stores