·
Ciência da Computação ·
Rede de Computadores
Send your question to AI and receive an answer instantly
Recommended for you
Preview text
UNIVERSIDADE ESTADUAL DO OESTE DO PARANÁ CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS COLEGIADO DE CIÊNCIA DA COMPUTAÇÃO Avaliação 5 de Redes de Computadores 100 pontos Trabalho Prático de Implementação Professor Luiz Antonio Rodrigues Data da entrega e apresentação 29052024 Versão 101 Última atualização 09maio2024 Objetivo Tratase de um trabalho prático de implementação de uma aplicação clienteservidor para comunicação em grupo utilizando sockets e criptografia Os clientes devem se registrar no servidor e podem criar salas com ou sem código de acesso hash listar salas abertas e solicitar a entrada em uma sala O administrador da sala também pode fechar a sala e banir outros usuários da Se a sala é privada com senha o cliente deve informar a senha para entrar Clientes podem enviar mensagens para uma determinada sala separadamente e todos os outros clientes da sala devem receber a mensagem Um cliente também deve poder sair da sala Especificação detalhada 1 Configuração do Servidor Utilizar sockets TCP para comunicação entre clientes e servidor Configurar o servidor para gerenciar o registro de clientes e salas de batepapo 2 Registro de Clientes Implementar um processo de registro de clientes no servidor Cada cliente deve fornecer um nome de usuário único durante o registro não são permitidos espaços no nome O servidor deve manter uma lista de clientes registrados 3 Gerenciamento de Salas Permitir que os clientes criem novas salas de batepapo As salas podem ser públicas sem senha ou privadas com senha Usar hash SHA 256 quando precisar transmitir a senha As salas devem ser identificadas por um nome único não são permitidos espaços no nome O servidor deve manter uma lista de salas de batepapo disponíveis O administrador da sala pode fechar a sala e banir outros usuários 4 Entrada e Saída de Salas Implementar um processo de entrada de clientes em salas de batepapo Os clientes devem ser capazes de ver uma lista de salas disponíveis e escolher em qual entrar Se a sala é privada o cliente deve fornecer a senha hash correta para entrar Os clientes devem ser capazes de sair de uma sala a qualquer momento A saída pode ser solicitada formalmente ou registrada pelo servidor em caso de desconexão do cliente 5 Comunicação em Grupo Permitir que os clientes enviem mensagens para uma sala de batepapo As mensagens enviadas por um cliente devem ser recebidas por todos os outros clientes na mesma sala Implementar um sistema de criptografia para garantir a segurança das mensagens transmitidas entre clientes e servidor 6 Interface do Cliente Implementar uma interface de usuário para o cliente A interface deve permitir que o usuário escolha ações como registrarse entrar em uma sala enviar mensagens etc A interface deve fornecer feedback claro ao usuário sobre o status de suas ações 7 Segurança Utilizar técnicas de criptografia para proteger a comunicação entre clientes e servidor Implementar um sistema seguro de autenticação de clientes e autorização de acesso a salas privadas 8 Testes e Depuração Realizar testes extensivos para garantir o funcionamento correto da aplicação em diferentes cenários Depurar quaisquer problemas ou erros encontrados durante os testes Essas etapas podem ser implementadas utilizando uma linguagem de programação como Python Java ou C juntamente com bibliotecas de criptografia e comunicação por socket apropriadas Em Python por exemplo podese usar a biblioteca socket padrão Em Java a classe Socket da API padrão pode ser utilizada para comunicação por socket Definição do Protocolo Para definir o protocolo de comunicação entre o cliente e o servidor é necessário estabelecer um formato padrão para as mensagens trocadas em cada etapa de acordo com o formato para as mensagens em cada etapa do processo Registro de Clientes Cliente para Servidor REGISTRO nomedeusuario Servidor para Cliente Confirmação REGISTROOK Servidor para Cliente Erro já existe usuário com o nome por exemplo ERRO mensagemdeerro Criação de Salas Cliente para Servidor CRIARSALA tipodesala PUBLICA PRIVADA nomedasala hashsenha Para salas privadas o campo senha é obrigatório Servidor para Cliente Confirmação CRIARSALAOK Servidor para Cliente Erro já existe sala com o mesmo nome ou ausência de senha para salas privadas por exemplo ERRO mensagemdeerro Listar as salas Cliente para servidor LISTARSALAS Servidor para cliente SALAS listadesalas Servidor para Cliente Erro usuário não está autenticado por exemplo ERRO mensagemdeerro Entrada em Salas Cliente para Servidor ENTRARSALA nomedasala hashsenha Para salas privadas o campo senha é obrigatório Servidor para Cliente Confirmação ENTRARSALAOK listausuariosnasala Ex ENTRARSALAOK user1 user2 Servidor avisa os demais com ENTROU nomedasala nomedousuario Servidor para Cliente Erro senha incorreta ou sala não existe por exemplo ERRO mensagemdeerro Saída de Salas Cliente para Servidor SAIRSALA nomedasala Servidor para Cliente Confirmação SAIRSALAOK Servidor avisa os demais com SAIU nomedasala nomedousuario Servidor para Cliente Erro sala não existe por exemplo ERRO mensagemdeerro Envio de Mensagens Cliente para Servidor ENVIARMENSAGEM nomedasala mensagem Servidor para Cliente MENSAGEM nomedasala nomedoremetente mensagem Servidor para Cliente Erro sala não existe por exemplo ERRO mensagemdeerro Fechar uma sala O administrador da sala envia uma mensagem ao servidor solicitando o fechamento da sala O servidor confirma o fechamento da sala para o administrador e notifica todos os membros da sala sobre o fechamento Mensagem do Cliente para o Servidor FECHARSALA nomedasala Mensagem do Servidor para o Cliente Administrador FECHARSALAOK Servidor para Cliente Erro por exemplo usuário não é o administrador ERRO mensagemdeerro Mensagem do Servidor para os Membros da Sala SALAFECHADA nomedasala Após o fechamento nenhuma outra mensagem deve enviada pelo servidor naquela sala Banir um usuário O administrador da sala envia uma mensagem ao servidor solicitando o banimento de um usuário específico da sala Mensagem do Cliente para o Servidor BANIRUSUARIO nomedasala nomedousuarioaserbanido O servidor confirma o banimento do usuário para o administrador e notifica o usuário banido sobre sua exclusão da sala Mensagem do Servidor para o Cliente Administrador BANIMENTOOK nomedousuariobanido Mensagem do Servidor para o Usuário Banido BANIDODASALA nomedasala Servidor avisa os demais com SAIU nomedasala nomedousuario Servidor para Cliente Erro por exemplo usuário não é o administrador ou o usuário a ser banido não está na sala ERRO mensagemdeerro Neste protocolo simplificado cada mensagem é representada por uma string contendo um comando e seus parâmetros separados por espaços O servidor e o cliente podem interpretar essas mensagens de acordo com o comando recebido Por exemplo o servidor pode analisar a mensagem CRIARSALA para criar uma nova sala com o nome especificado pelo cliente Se a sala pode ser criada uma mensagem CRIARSALAOK deve ser retornada para o cliente No entanto se já existe uma sala com o mesmo nome uma mensagem de ERRO mensagemdeerroSala já existe por exemplo deve ser utilizada Além disso é importante considerar mecanismos adicionais para garantir a segurança das comunicações como a autenticação dos clientes e a criptografia das mensagens transmitidas entre o cliente e o servidor Esses aspectos deve ser integrados ao protocolo para fornecer uma camada adicional de segurança como descrito a seguir Segurança Para estabelecer um protocolo de autenticação do cliente com o servidor usando uma chave de criptografia simétrica e a chave pública do servidor devese seguir as seguintes etapas após o registro do usuário 1 Solicitação de Autenticação pelo Cliente O cliente envia uma mensagem ao servidor solicitando a autenticação junto com sua identificação Mensagem do Cliente para o Servidor AUTENTICACAO nomedousuario 2 Resposta do Servidor com a Chave Pública O servidor responde ao cliente com sua chave pública para estabelecer uma conexão segura usando o algoritmo RSA com 1024 bits Mensagem do Servidor para o Cliente CHAVEPUBLICA chavepublicadoservidor 3 Criação da Chave de Criptografia Simétrica pelo Cliente O cliente usa a chave pública do servidor para enviar uma chave de criptografia simétrica pra o algoritmo AES ao servidor O cliente deve usar o algoritmo RSA para criptografar a chave simétrica Mensagem do Cliente para o Servidor CHAVESIMETRICA chavesimetricacriptografada 4 Descriptografia da Chave Simétrica pelo Servidor O servidor recebe a chave simétrica AES criptografada do cliente O servidor usa sua chave privada para descriptografar a chave simétrica O servidor agora possui a chave de criptografia simétrica compartilhada com o cliente e deve usar o algoritmo AES para trocar mensagens seguras Após essas etapas tanto o cliente quanto o servidor possuem a mesma chave de criptografia simétrica que pode ser usada para criptografar e descriptografar as mensagens trocadas entre eles Isso estabelece uma conexão segura entre o cliente e o servidor garantindo a autenticidade e a confidencialidade das comunicações Atenção Todas as chaves criptográficas e mensagens criptografadas devem ser enviadas usando a codificação Base64 Rede de Computadores Trabalho Prático Chat em grupo 1 Configuração do Servidor Usaremos o sockets TCP import socket import threading import hashlib from cryptographyfernet import Fernet Constantes HOST localhost PORT 12345 Listas para armazenar clientes e salas clients rooms Função para lidar com clientes def handleclientclientsocket addr printfNEW CONNECTION addr connected while True try msg clientsocketrecv1024decodeutf8 if msg printfaddr msg Processar mensagem processmessageclientsocket msg else break except break printfDISCONNECT addr disconnected clientsocketclose Função para processar mensagens def processmessageclientsocket msg Implementar lógica para processar as mensagens pass Função para iniciar o servidor def startserver server socketsocketsocketAFINET socketSOCKSTREAM serverbindHOST PORT serverlisten printfLISTENING Server is listening on HOSTPORT while True clientsocket addr serveraccept clienthandler threadingThreadtargethandleclient argsclientsocket addr clienthandlerstart if name main startserver 2 Registro de Clientes No registro de clientes cada cliente deve fornecer um nome de usuário único import json def handleclientclientsocket addr printfNEW CONNECTION addr connected while True try msg clientsocketrecv1024decodeutf8 if msg printfaddr msg data jsonloadsmsg action dataaction if action register username datausername if username not in clientusername for client in clients clientsappendsocket clientsocket username username clientsocketsendjsondumpsstatus success message Registered successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Username already takenencodeutf8 Implementar outras ações else break except break printfDISCONNECT addr disconnected clientsocketclose Função para iniciar o servidor def startserver server socketsocketsocketAFINET socketSOCKSTREAM serverbindHOST PORT serverlisten printfLISTENING Server is listening on HOSTPORT while True clientsocket addr serveraccept clienthandler threadingThreadtargethandleclient argsclientsocket addr clienthandlerstart if name main startserver 3 Gerenciamento de Salas import json import hashlib def handleclientclientsocket addr printfNEW CONNECTION addr connected while True try msg clientsocketrecv1024decodeutf8 if msg printfaddr msg data jsonloadsmsg action dataaction if action register username datausername if username not in clientusername for client in clients clientsappendsocket clientsocket username username clientsocketsendjsondumpsstatus success message Registered successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Username already takenencodeutf8 elif action createroom roomname dataroomname password datagetpassword if roomname not in rooms roomsroomname clients admin clientsocket password hashlibsha256passwordencodehexdigest if password else None clientsocketsendjsondumpsstatus success message Room created successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Room name already takenencodeutf8 Implementar outras ações else break except break printfDISCONNECT addr disconnected clientsocketclose Função para iniciar o servidor def startserver server socketsocketsocketAFINET socketSOCKSTREAM serverbindHOST PORT serverlisten printfLISTENING Server is listening on HOSTPORT while True clientsocket addr serveraccept clienthandler threadingThreadtargethandleclient argsclientsocket addr clienthandlerstart if name main startserver 4 Entrada e Saída de Salas Clientes podem entrar em salas disponíveis e sair delas def handleclientclientsocket addr printfNEW CONNECTION addr connected while True try msg clientsocketrecv1024decodeutf8 if msg printfaddr msg data jsonloadsmsg action dataaction if action register username datausername if username not in clientusername for client in clients clientsappendsocket clientsocket username username clientsocketsendjsondumpsstatus success message Registered successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Username already takenencodeutf8 elif action createroom roomname dataroomname password datagetpassword if roomname not in rooms roomsroomname clients admin clientsocket password hashlibsha256passwordencodehexdigest if password else None clientsocketsendjsondumpsstatus success message Room created successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Room name already takenencodeutf8 elif action joinroom roomname dataroomname password datagetpassword if roomname in rooms room roomsroomname if roompassword if hashlibsha256passwordencodehexdigest roompassword roomclientsappendclientsocket clientsocketsendjsondumpsstatus success message Joined room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Incorrect passwordencodeutf8 else roomclientsappendclientsocket clientsocketsendjsondumpsstatus success message Joined room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Room not foundencodeutf8 elif action leaveroom roomname dataroomname if roomname in rooms room roomsroomname if clientsocket in roomclients roomclientsremoveclientsocket clientsocketsendjsondumpsstatus success message Left room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message You are not in this roomencodeutf8 else clientsocketsendjsondumpsstatus error message Room not foundencodeutf8 Implementar outras ações else break except break printfDISCONNECT addr disconnected clientsocketclose Função para iniciar o servidor def startserver server socketsocketsocketAFINET socketSOCKSTREAM serverbindHOST PORT serverlisten printfLISTENING Server is listening on HOSTPORT while True clientsocket addr serveraccept clienthandler threadingThreadtargethandleclient argsclientsocket addr clienthandlerstart if name main startserver 5 Comunicação em Grupo import json import hashlib from cryptographyfernet import Fernet Gerar chave de criptografia key Fernetgeneratekey ciphersuite Fernetkey def handleclientclientsocket addr printfNEW CONNECTION addr connected while True try msg clientsocketrecv1024decodeutf8 if msg printfaddr msg data jsonloadsmsg action dataaction if action register username datausername if username not in clientusername for client in clients clientsappendsocket clientsocket username username clientsocketsendjsondumpsstatus success message Registered successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Username already takenencodeutf8 elif action createroom roomname dataroomname password datagetpassword if roomname not in rooms roomsroomname clients admin clientsocket password hashlibsha256passwordencodehexdigest if password else None clientsocketsendjsondumpsstatus success message Room created successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Room name already takenencodeutf8 elif action joinroom roomname dataroomname password datagetpassword if roomname in rooms room roomsroomname if roompassword if hashlibsha256passwordencodehexdigest roompassword roomclientsappendclientsocket clientsocketsendjsondumpsstatus success message Joined room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Incorrect passwordencodeutf8 else roomclientsappendclientsocket clientsocketsendjsondumpsstatus success message Joined room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Room not foundencodeutf8 elif action leaveroom roomname dataroomname if roomname in rooms room roomsroomname if clientsocket in roomclients roomclientsremoveclientsocket clientsocketsendjsondumpsstatus success message Left room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message You are not in this roomencodeutf8 else clientsocketsendjsondumpsstatus error message Room not foundencodeutf8 elif action sendmessage roomname dataroomname message datamessage if roomname in rooms room roomsroomname if clientsocket in roomclients encryptedmessage ciphersuiteencryptmessageencode for client in roomclients if client clientsocket clientsendjsondumpsaction receivemessage message encryptedmessagedecodeencodeutf8 else clientsocketsendjsondumpsstatus error message You are not in this roomencodeutf8 else clientsocketsendjsondumpsstatus error message Room not foundencodeutf8 Implementar outras ações else break except break printfDISCONNECT addr disconnected clientsocketclose Função para iniciar o servidor def startserver server socketsocketsocketAFINET socketSOCKSTREAM serverbindHOST PORT serverlisten printfLISTENING Server is listening on HOSTPORT while True clientsocket addr serveraccept clienthandler threadingThreadtargethandleclient argsclientsocket addr clienthandlerstart if name main startserver 6 Interface do Cliente import socket import json import hashlib from cryptographyfernet import Fernet import threading Gerar chave de criptografia key Fernetgeneratekey ciphersuite Fernetkey HOST localhost PORT 12345 def sendmessageclientsocket while True message input clientsocketsendmessageencodeutf8 def receivemessageclientsocket while True try msg clientsocketrecv1024decodeutf8 if msg data jsonloadsmsg if dataaction receivemessage decryptedmessage ciphersuitedecryptdatamessageencodedecode printfMessage decryptedmessage else printfServer datamessage except break def startclient clientsocket socketsocketsocketAFINET socketSOCKSTREAM clientsocketconnectHOST PORT username inputEnter your username clientsocketsendjsondumpsaction register username usernameencodeutf8 threadingThreadtargetsendmessage argsclientsocketstart threadingThreadtargetreceivemessage argsclientsocketstart if name main startclient
Send your question to AI and receive an answer instantly
Recommended for you
Preview text
UNIVERSIDADE ESTADUAL DO OESTE DO PARANÁ CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS COLEGIADO DE CIÊNCIA DA COMPUTAÇÃO Avaliação 5 de Redes de Computadores 100 pontos Trabalho Prático de Implementação Professor Luiz Antonio Rodrigues Data da entrega e apresentação 29052024 Versão 101 Última atualização 09maio2024 Objetivo Tratase de um trabalho prático de implementação de uma aplicação clienteservidor para comunicação em grupo utilizando sockets e criptografia Os clientes devem se registrar no servidor e podem criar salas com ou sem código de acesso hash listar salas abertas e solicitar a entrada em uma sala O administrador da sala também pode fechar a sala e banir outros usuários da Se a sala é privada com senha o cliente deve informar a senha para entrar Clientes podem enviar mensagens para uma determinada sala separadamente e todos os outros clientes da sala devem receber a mensagem Um cliente também deve poder sair da sala Especificação detalhada 1 Configuração do Servidor Utilizar sockets TCP para comunicação entre clientes e servidor Configurar o servidor para gerenciar o registro de clientes e salas de batepapo 2 Registro de Clientes Implementar um processo de registro de clientes no servidor Cada cliente deve fornecer um nome de usuário único durante o registro não são permitidos espaços no nome O servidor deve manter uma lista de clientes registrados 3 Gerenciamento de Salas Permitir que os clientes criem novas salas de batepapo As salas podem ser públicas sem senha ou privadas com senha Usar hash SHA 256 quando precisar transmitir a senha As salas devem ser identificadas por um nome único não são permitidos espaços no nome O servidor deve manter uma lista de salas de batepapo disponíveis O administrador da sala pode fechar a sala e banir outros usuários 4 Entrada e Saída de Salas Implementar um processo de entrada de clientes em salas de batepapo Os clientes devem ser capazes de ver uma lista de salas disponíveis e escolher em qual entrar Se a sala é privada o cliente deve fornecer a senha hash correta para entrar Os clientes devem ser capazes de sair de uma sala a qualquer momento A saída pode ser solicitada formalmente ou registrada pelo servidor em caso de desconexão do cliente 5 Comunicação em Grupo Permitir que os clientes enviem mensagens para uma sala de batepapo As mensagens enviadas por um cliente devem ser recebidas por todos os outros clientes na mesma sala Implementar um sistema de criptografia para garantir a segurança das mensagens transmitidas entre clientes e servidor 6 Interface do Cliente Implementar uma interface de usuário para o cliente A interface deve permitir que o usuário escolha ações como registrarse entrar em uma sala enviar mensagens etc A interface deve fornecer feedback claro ao usuário sobre o status de suas ações 7 Segurança Utilizar técnicas de criptografia para proteger a comunicação entre clientes e servidor Implementar um sistema seguro de autenticação de clientes e autorização de acesso a salas privadas 8 Testes e Depuração Realizar testes extensivos para garantir o funcionamento correto da aplicação em diferentes cenários Depurar quaisquer problemas ou erros encontrados durante os testes Essas etapas podem ser implementadas utilizando uma linguagem de programação como Python Java ou C juntamente com bibliotecas de criptografia e comunicação por socket apropriadas Em Python por exemplo podese usar a biblioteca socket padrão Em Java a classe Socket da API padrão pode ser utilizada para comunicação por socket Definição do Protocolo Para definir o protocolo de comunicação entre o cliente e o servidor é necessário estabelecer um formato padrão para as mensagens trocadas em cada etapa de acordo com o formato para as mensagens em cada etapa do processo Registro de Clientes Cliente para Servidor REGISTRO nomedeusuario Servidor para Cliente Confirmação REGISTROOK Servidor para Cliente Erro já existe usuário com o nome por exemplo ERRO mensagemdeerro Criação de Salas Cliente para Servidor CRIARSALA tipodesala PUBLICA PRIVADA nomedasala hashsenha Para salas privadas o campo senha é obrigatório Servidor para Cliente Confirmação CRIARSALAOK Servidor para Cliente Erro já existe sala com o mesmo nome ou ausência de senha para salas privadas por exemplo ERRO mensagemdeerro Listar as salas Cliente para servidor LISTARSALAS Servidor para cliente SALAS listadesalas Servidor para Cliente Erro usuário não está autenticado por exemplo ERRO mensagemdeerro Entrada em Salas Cliente para Servidor ENTRARSALA nomedasala hashsenha Para salas privadas o campo senha é obrigatório Servidor para Cliente Confirmação ENTRARSALAOK listausuariosnasala Ex ENTRARSALAOK user1 user2 Servidor avisa os demais com ENTROU nomedasala nomedousuario Servidor para Cliente Erro senha incorreta ou sala não existe por exemplo ERRO mensagemdeerro Saída de Salas Cliente para Servidor SAIRSALA nomedasala Servidor para Cliente Confirmação SAIRSALAOK Servidor avisa os demais com SAIU nomedasala nomedousuario Servidor para Cliente Erro sala não existe por exemplo ERRO mensagemdeerro Envio de Mensagens Cliente para Servidor ENVIARMENSAGEM nomedasala mensagem Servidor para Cliente MENSAGEM nomedasala nomedoremetente mensagem Servidor para Cliente Erro sala não existe por exemplo ERRO mensagemdeerro Fechar uma sala O administrador da sala envia uma mensagem ao servidor solicitando o fechamento da sala O servidor confirma o fechamento da sala para o administrador e notifica todos os membros da sala sobre o fechamento Mensagem do Cliente para o Servidor FECHARSALA nomedasala Mensagem do Servidor para o Cliente Administrador FECHARSALAOK Servidor para Cliente Erro por exemplo usuário não é o administrador ERRO mensagemdeerro Mensagem do Servidor para os Membros da Sala SALAFECHADA nomedasala Após o fechamento nenhuma outra mensagem deve enviada pelo servidor naquela sala Banir um usuário O administrador da sala envia uma mensagem ao servidor solicitando o banimento de um usuário específico da sala Mensagem do Cliente para o Servidor BANIRUSUARIO nomedasala nomedousuarioaserbanido O servidor confirma o banimento do usuário para o administrador e notifica o usuário banido sobre sua exclusão da sala Mensagem do Servidor para o Cliente Administrador BANIMENTOOK nomedousuariobanido Mensagem do Servidor para o Usuário Banido BANIDODASALA nomedasala Servidor avisa os demais com SAIU nomedasala nomedousuario Servidor para Cliente Erro por exemplo usuário não é o administrador ou o usuário a ser banido não está na sala ERRO mensagemdeerro Neste protocolo simplificado cada mensagem é representada por uma string contendo um comando e seus parâmetros separados por espaços O servidor e o cliente podem interpretar essas mensagens de acordo com o comando recebido Por exemplo o servidor pode analisar a mensagem CRIARSALA para criar uma nova sala com o nome especificado pelo cliente Se a sala pode ser criada uma mensagem CRIARSALAOK deve ser retornada para o cliente No entanto se já existe uma sala com o mesmo nome uma mensagem de ERRO mensagemdeerroSala já existe por exemplo deve ser utilizada Além disso é importante considerar mecanismos adicionais para garantir a segurança das comunicações como a autenticação dos clientes e a criptografia das mensagens transmitidas entre o cliente e o servidor Esses aspectos deve ser integrados ao protocolo para fornecer uma camada adicional de segurança como descrito a seguir Segurança Para estabelecer um protocolo de autenticação do cliente com o servidor usando uma chave de criptografia simétrica e a chave pública do servidor devese seguir as seguintes etapas após o registro do usuário 1 Solicitação de Autenticação pelo Cliente O cliente envia uma mensagem ao servidor solicitando a autenticação junto com sua identificação Mensagem do Cliente para o Servidor AUTENTICACAO nomedousuario 2 Resposta do Servidor com a Chave Pública O servidor responde ao cliente com sua chave pública para estabelecer uma conexão segura usando o algoritmo RSA com 1024 bits Mensagem do Servidor para o Cliente CHAVEPUBLICA chavepublicadoservidor 3 Criação da Chave de Criptografia Simétrica pelo Cliente O cliente usa a chave pública do servidor para enviar uma chave de criptografia simétrica pra o algoritmo AES ao servidor O cliente deve usar o algoritmo RSA para criptografar a chave simétrica Mensagem do Cliente para o Servidor CHAVESIMETRICA chavesimetricacriptografada 4 Descriptografia da Chave Simétrica pelo Servidor O servidor recebe a chave simétrica AES criptografada do cliente O servidor usa sua chave privada para descriptografar a chave simétrica O servidor agora possui a chave de criptografia simétrica compartilhada com o cliente e deve usar o algoritmo AES para trocar mensagens seguras Após essas etapas tanto o cliente quanto o servidor possuem a mesma chave de criptografia simétrica que pode ser usada para criptografar e descriptografar as mensagens trocadas entre eles Isso estabelece uma conexão segura entre o cliente e o servidor garantindo a autenticidade e a confidencialidade das comunicações Atenção Todas as chaves criptográficas e mensagens criptografadas devem ser enviadas usando a codificação Base64 Rede de Computadores Trabalho Prático Chat em grupo 1 Configuração do Servidor Usaremos o sockets TCP import socket import threading import hashlib from cryptographyfernet import Fernet Constantes HOST localhost PORT 12345 Listas para armazenar clientes e salas clients rooms Função para lidar com clientes def handleclientclientsocket addr printfNEW CONNECTION addr connected while True try msg clientsocketrecv1024decodeutf8 if msg printfaddr msg Processar mensagem processmessageclientsocket msg else break except break printfDISCONNECT addr disconnected clientsocketclose Função para processar mensagens def processmessageclientsocket msg Implementar lógica para processar as mensagens pass Função para iniciar o servidor def startserver server socketsocketsocketAFINET socketSOCKSTREAM serverbindHOST PORT serverlisten printfLISTENING Server is listening on HOSTPORT while True clientsocket addr serveraccept clienthandler threadingThreadtargethandleclient argsclientsocket addr clienthandlerstart if name main startserver 2 Registro de Clientes No registro de clientes cada cliente deve fornecer um nome de usuário único import json def handleclientclientsocket addr printfNEW CONNECTION addr connected while True try msg clientsocketrecv1024decodeutf8 if msg printfaddr msg data jsonloadsmsg action dataaction if action register username datausername if username not in clientusername for client in clients clientsappendsocket clientsocket username username clientsocketsendjsondumpsstatus success message Registered successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Username already takenencodeutf8 Implementar outras ações else break except break printfDISCONNECT addr disconnected clientsocketclose Função para iniciar o servidor def startserver server socketsocketsocketAFINET socketSOCKSTREAM serverbindHOST PORT serverlisten printfLISTENING Server is listening on HOSTPORT while True clientsocket addr serveraccept clienthandler threadingThreadtargethandleclient argsclientsocket addr clienthandlerstart if name main startserver 3 Gerenciamento de Salas import json import hashlib def handleclientclientsocket addr printfNEW CONNECTION addr connected while True try msg clientsocketrecv1024decodeutf8 if msg printfaddr msg data jsonloadsmsg action dataaction if action register username datausername if username not in clientusername for client in clients clientsappendsocket clientsocket username username clientsocketsendjsondumpsstatus success message Registered successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Username already takenencodeutf8 elif action createroom roomname dataroomname password datagetpassword if roomname not in rooms roomsroomname clients admin clientsocket password hashlibsha256passwordencodehexdigest if password else None clientsocketsendjsondumpsstatus success message Room created successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Room name already takenencodeutf8 Implementar outras ações else break except break printfDISCONNECT addr disconnected clientsocketclose Função para iniciar o servidor def startserver server socketsocketsocketAFINET socketSOCKSTREAM serverbindHOST PORT serverlisten printfLISTENING Server is listening on HOSTPORT while True clientsocket addr serveraccept clienthandler threadingThreadtargethandleclient argsclientsocket addr clienthandlerstart if name main startserver 4 Entrada e Saída de Salas Clientes podem entrar em salas disponíveis e sair delas def handleclientclientsocket addr printfNEW CONNECTION addr connected while True try msg clientsocketrecv1024decodeutf8 if msg printfaddr msg data jsonloadsmsg action dataaction if action register username datausername if username not in clientusername for client in clients clientsappendsocket clientsocket username username clientsocketsendjsondumpsstatus success message Registered successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Username already takenencodeutf8 elif action createroom roomname dataroomname password datagetpassword if roomname not in rooms roomsroomname clients admin clientsocket password hashlibsha256passwordencodehexdigest if password else None clientsocketsendjsondumpsstatus success message Room created successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Room name already takenencodeutf8 elif action joinroom roomname dataroomname password datagetpassword if roomname in rooms room roomsroomname if roompassword if hashlibsha256passwordencodehexdigest roompassword roomclientsappendclientsocket clientsocketsendjsondumpsstatus success message Joined room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Incorrect passwordencodeutf8 else roomclientsappendclientsocket clientsocketsendjsondumpsstatus success message Joined room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Room not foundencodeutf8 elif action leaveroom roomname dataroomname if roomname in rooms room roomsroomname if clientsocket in roomclients roomclientsremoveclientsocket clientsocketsendjsondumpsstatus success message Left room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message You are not in this roomencodeutf8 else clientsocketsendjsondumpsstatus error message Room not foundencodeutf8 Implementar outras ações else break except break printfDISCONNECT addr disconnected clientsocketclose Função para iniciar o servidor def startserver server socketsocketsocketAFINET socketSOCKSTREAM serverbindHOST PORT serverlisten printfLISTENING Server is listening on HOSTPORT while True clientsocket addr serveraccept clienthandler threadingThreadtargethandleclient argsclientsocket addr clienthandlerstart if name main startserver 5 Comunicação em Grupo import json import hashlib from cryptographyfernet import Fernet Gerar chave de criptografia key Fernetgeneratekey ciphersuite Fernetkey def handleclientclientsocket addr printfNEW CONNECTION addr connected while True try msg clientsocketrecv1024decodeutf8 if msg printfaddr msg data jsonloadsmsg action dataaction if action register username datausername if username not in clientusername for client in clients clientsappendsocket clientsocket username username clientsocketsendjsondumpsstatus success message Registered successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Username already takenencodeutf8 elif action createroom roomname dataroomname password datagetpassword if roomname not in rooms roomsroomname clients admin clientsocket password hashlibsha256passwordencodehexdigest if password else None clientsocketsendjsondumpsstatus success message Room created successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Room name already takenencodeutf8 elif action joinroom roomname dataroomname password datagetpassword if roomname in rooms room roomsroomname if roompassword if hashlibsha256passwordencodehexdigest roompassword roomclientsappendclientsocket clientsocketsendjsondumpsstatus success message Joined room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Incorrect passwordencodeutf8 else roomclientsappendclientsocket clientsocketsendjsondumpsstatus success message Joined room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message Room not foundencodeutf8 elif action leaveroom roomname dataroomname if roomname in rooms room roomsroomname if clientsocket in roomclients roomclientsremoveclientsocket clientsocketsendjsondumpsstatus success message Left room successfullyencodeutf8 else clientsocketsendjsondumpsstatus error message You are not in this roomencodeutf8 else clientsocketsendjsondumpsstatus error message Room not foundencodeutf8 elif action sendmessage roomname dataroomname message datamessage if roomname in rooms room roomsroomname if clientsocket in roomclients encryptedmessage ciphersuiteencryptmessageencode for client in roomclients if client clientsocket clientsendjsondumpsaction receivemessage message encryptedmessagedecodeencodeutf8 else clientsocketsendjsondumpsstatus error message You are not in this roomencodeutf8 else clientsocketsendjsondumpsstatus error message Room not foundencodeutf8 Implementar outras ações else break except break printfDISCONNECT addr disconnected clientsocketclose Função para iniciar o servidor def startserver server socketsocketsocketAFINET socketSOCKSTREAM serverbindHOST PORT serverlisten printfLISTENING Server is listening on HOSTPORT while True clientsocket addr serveraccept clienthandler threadingThreadtargethandleclient argsclientsocket addr clienthandlerstart if name main startserver 6 Interface do Cliente import socket import json import hashlib from cryptographyfernet import Fernet import threading Gerar chave de criptografia key Fernetgeneratekey ciphersuite Fernetkey HOST localhost PORT 12345 def sendmessageclientsocket while True message input clientsocketsendmessageencodeutf8 def receivemessageclientsocket while True try msg clientsocketrecv1024decodeutf8 if msg data jsonloadsmsg if dataaction receivemessage decryptedmessage ciphersuitedecryptdatamessageencodedecode printfMessage decryptedmessage else printfServer datamessage except break def startclient clientsocket socketsocketsocketAFINET socketSOCKSTREAM clientsocketconnectHOST PORT username inputEnter your username clientsocketsendjsondumpsaction register username usernameencodeutf8 threadingThreadtargetsendmessage argsclientsocketstart threadingThreadtargetreceivemessage argsclientsocketstart if name main startclient