From c2c4a1df82baad06e54dd496c3af2b181098d50b Mon Sep 17 00:00:00 2001 From: LucasVerdelho Date: Mon, 22 Apr 2024 14:46:10 +0100 Subject: [PATCH 1/4] Started Report --- Projs/PD1/README.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Projs/PD1/README.md b/Projs/PD1/README.md index cfeaf02..8c66f37 100644 --- a/Projs/PD1/README.md +++ b/Projs/PD1/README.md @@ -1,6 +1,26 @@ -# Report +# Relatório do Projeto de Desenvolvimento 1 + +## Introduçã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. ## Key Store generation + +## Server + +### Data Store + + + +## Client + + + + [Commands used to generate the key stores](./certs/README.md) From 0889899b4907cf018a1a152704acdb4342de8bfd Mon Sep 17 00:00:00 2001 From: LucasVerdelho Date: Mon, 22 Apr 2024 15:08:11 +0100 Subject: [PATCH 2/4] [PD1] - Report - Arquitetura --- Projs/PD1/README.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Projs/PD1/README.md b/Projs/PD1/README.md index 8c66f37..0254b99 100644 --- a/Projs/PD1/README.md +++ b/Projs/PD1/README.md @@ -8,8 +8,30 @@ Algumas notas sobre o projeto: - 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 +É 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 + + + +## Diagramas + + + + +## Protocolo de comunicação + -## Key Store generation ## Server From 417f9851f35ed896a6b9ddd2094f888839738a7a Mon Sep 17 00:00:00 2001 From: LucasVerdelho Date: Mon, 22 Apr 2024 15:18:25 +0100 Subject: [PATCH 3/4] [PD1] - Report - Protocol --- Projs/PD1/README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Projs/PD1/README.md b/Projs/PD1/README.md index 0254b99..a123365 100644 --- a/Projs/PD1/README.md +++ b/Projs/PD1/README.md @@ -22,18 +22,21 @@ O canal de comunicação estabelecido entre o cliente e o servidor nesta impleme ### 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 -## Protocolo de comunicação - - - - ## Server ### Data Store From 0c9ef6122ec3e5acc524e10d67f4c2bd881bc359 Mon Sep 17 00:00:00 2001 From: tsousa111 Date: Mon, 22 Apr 2024 19:30:43 +0100 Subject: [PATCH 4/4] [PD1] changed the order of signature and content --- Projs/PD1/internal/utils/cryptoUtils/cryptoUtils.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Projs/PD1/internal/utils/cryptoUtils/cryptoUtils.go b/Projs/PD1/internal/utils/cryptoUtils/cryptoUtils.go index 86b147c..c3e0eb4 100644 --- a/Projs/PD1/internal/utils/cryptoUtils/cryptoUtils.go +++ b/Projs/PD1/internal/utils/cryptoUtils/cryptoUtils.go @@ -160,11 +160,13 @@ func (k KeyStore) EncryptMessageContent(receiverCert *x509.Certificate, content // sign the message and append the signature hashedContent := sha256.Sum256(content) + // NOTE: in this case the sign then encrypt method is used + // but should it be used over the encrypt then sign method? signature, err := rsa.SignPKCS1v15(nil, k.privKey, crypto.SHA256, hashedContent[:]) if err != nil { log.Panicln("Could not create content signature: ", err) } - content = pair(content, signature) + content = pair(signature, content) ciphertext := cipher.Seal(nonce, nonce, content, nil) // crypto/rand.Reader is a good source of entropy for randomizing the @@ -196,7 +198,7 @@ func (k KeyStore) DecryptMessageContent(senderCert *x509.Certificate, cipherCont log.Panicln("Could not decrypt ciphertext: ", err) } // check signature with sender public key - content, signature := unPair(contentAndSig) + signature, content:= unPair(contentAndSig) hashedContent := sha256.Sum256(content) senderKey := senderCert.PublicKey.(*rsa.PublicKey) if err := rsa.VerifyPKCS1v15(senderKey, crypto.SHA256, hashedContent[:], signature); err != nil {