CSI-ES-2324/Projs/PD1
2024-04-23 11:35:25 +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
report_content [PD1] - Report Added Digital Envelope Diagram and more topics to develop 2024-04-23 11:35:25 +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] - Report Added Digital Envelope Diagram and more topics to develop 2024-04-23 11:35:25 +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.

Certificates and Keys

Falar da criacao de certificados e chaves para o servidor e clientes e se calhar das fake ou entao no fim para falar da validacao e seguranca contra ataques

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

Digital Envelope

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.

Server

Data Store

Verificaçao de dados ? Proteçao contra ataques a base de dados (falar apenas em nota que nao foi implementado, possivelmente fora do scope deste projeto)

Client

Verificacao e Teste de Seguranca

falar da fakeCA

Commands used to generate the key stores