.. | ||
certs | ||
cmd | ||
internal | ||
report_content | ||
.gitignore | ||
.ignore | ||
go.mod | ||
go.sum | ||
ltex.dictionary.en-US.txt | ||
README.md | ||
server.db | ||
tokefile.toml |
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
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