Chat de linha de comando com criptografia end-to-end — handshake RSA 512-bit para troca segura de chaves simétricas + Fernet para encriptação da sessão, servidor assíncrono Sanic com 3 endpoints WebSocket (/talk para mensagens, /update para sincronização de estado, /get_key para handshake RSA com PEM), validação de payloads via Pydantic, interface Rich/Colorama com cores por IP e username, geração automática de usernames aleatórios (ex.: SmartFox52, BraveLion12), autenticação por ADMIN_PASSWORD, instalável via pip install -e . com executável cmd_chat no PATH.
⚠️ Projeto Arquivado Este projeto não recebe mais atualizações ou correções. O código permanece disponível como referência e pode ser utilizado livremente sob a licença MIT. Fique à vontade para fazer fork caso deseje continuar o desenvolvimento.
- Sobre o Projeto
- Demonstração
- Funcionalidades
- Tecnologias
- Arquitetura
- Começando
- Endpoints WebSocket
- Scripts Disponíveis
- FAQ
- Licença
- Contato
Chat de linha de comando que permite criar salas de chat criptografadas pelo terminal. Todas as mensagens são encriptadas usando criptografia híbrida: chaves simétricas Fernet negociadas com segurança via chaves assimétricas RSA 512-bit.
O repositório prioriza:
- Criptografia híbrida end-to-end — Handshake RSA 512-bit para troca segura de chave simétrica + Fernet (AES-128-CBC com HMAC) para encriptação de cada mensagem da sessão. O endpoint
/get_keyrecebe a public key do cliente em formato PEM e retorna a chave Fernet encriptada com RSA - Servidor assíncrono Sanic — 3 endpoints WebSocket:
/talkpara envio de mensagens encriptadas em Fernet,/updatepara sincronização contínua de mensagens e lista de usuários online,/get_keypara handshake RSA com PEM. Armazenamento in-memory do estado da sala - Validação de contratos via Pydantic — Payloads WebSocket validados com modelos Pydantic:
/talkcom formato{"text": "<enc_msg>", "username": "...", "action": "..."},/updatecom{"messages": [...], "users_in_chat": [...]} - Interface CLI com Rich/Colorama — Terminal limpo e colorido com cores por IP e username, renderização Rich quando disponível com fallback para renderização padrão
- Username aleatório e autenticação — Geração automática de nomes ao ingressar (ex.:
SmartFox52,BraveLion12), autenticação do servidor viaADMIN_PASSWORDconfigurável - Instalável como executável —
pip install -e .registracmd_chatno PATH com subcomandosserveeconnect
Iniciando o servidor:
cmd_chat serve 127.0.0.1 5000 -p "senha_super_secreta"Conectando um cliente (em outro terminal):
cmd_chat connect 127.0.0.1 5000 "senha_super_secreta"- Comunicação encriptada — RSA 512-bit para troca segura de chaves + Fernet para sessão simétrica, criptografia end-to-end em todas as mensagens
- Servidor assíncrono — Sanic com alta performance para rotas HTTP e WebSockets simultâneos
- Rich UI — Terminal colorido com cores por IP e username, renderização Rich com fallback padrão
- Usernames aleatórios — Geração automática ao ingressar no servidor (ex.:
SmartFox52,BraveLion12) - Sincronização de estado — Endpoint
/updatecom lista de mensagens e usuários online em tempo real - Autenticação —
ADMIN_PASSWORDpara controle de acesso ao servidor - Validação de payloads — Contratos Pydantic para todos os payloads WebSocket
- Instalável via pip —
pip install -e .com executávelcmd_chatno PATH (serveeconnect)
sequenceDiagram
participant Cliente
participant Servidor as Servidor Sanic
Note over Cliente,Servidor: Handshake RSA
Cliente->>Cliente: Gera par RSA 512-bit (pub/priv)
Cliente->>Servidor: POST /get_key (public key PEM)
Servidor->>Servidor: Gera chave Fernet
Servidor->>Cliente: Chave Fernet encriptada com RSA pub
Note over Cliente,Servidor: Sessão encriptada
Cliente->>Servidor: WS /talk {"text": "Fernet(msg)", "username": "...", "action": "..."}
Servidor->>Cliente: WS /update {"messages": [...], "users_in_chat": [...]}
- Cliente gera par de chaves RSA 512-bit e envia public key em PEM via
/get_key - Servidor gera chave simétrica Fernet, encripta com a public key RSA do cliente e retorna
- Cliente decripta a chave Fernet com sua private key RSA
- Todas as mensagens subsequentes são encriptadas/decriptadas com Fernet (AES-128-CBC + HMAC)
| Componente | Responsabilidade |
|---|---|
| Servidor Sanic | Rotas HTTP/WebSocket, gerenciamento de salas, armazenamento in-memory |
| Handshake RSA | /get_key — troca segura de chave simétrica via RSA 512-bit PEM |
| Sessão Fernet | /talk — encriptação simétrica de mensagens com chave negociada |
| Sincronização | /update — broadcast de mensagens e lista de usuários online |
| Pydantic | Validação de payloads WebSocket (text, username, action, messages, users) |
| Rich/Colorama | Renderização CLI com cores por IP/username, fallback padrão |
- Python 3.10+
- pip e ambiente virtual
git clone https://github.com/ESousa97/cmd-chat.git
cd cmd-chat
# Ambiente virtual
python -m venv venv
# Linux/macOS
source venv/bin/activate
# Windows
.\venv\Scripts\activate
# Instalar
pip install -e .
# Configuração
cp .env.example .env
# Edite .env e defina ADMIN_PASSWORDServidor:
cmd_chat serve 127.0.0.1 5000 -p "senha_super_secreta"Cliente (em outro terminal):
cmd_chat connect 127.0.0.1 5000 "senha_super_secreta"Um username aleatório é gerado automaticamente ao conectar. Digite suas mensagens e inicie a conversa.
Também é possível executar via python cmd_chat.py diretamente.
| Endpoint | Tipo | Payload | Descrição |
|---|---|---|---|
/talk |
WS | {"text": "<enc_msg>", "username": "...", "action": "..."} |
Envio de mensagens encriptadas em Fernet |
/update |
WS | {"messages": [...], "users_in_chat": [...]} |
Sincronização contínua de mensagens e usuários online |
/get_key |
POST/GET | Public key PEM → Fernet key encriptada com RSA | Handshake RSA para troca de chave simétrica |
# Lint
ruff check .
# Formatação
ruff format .
# Testes
pytest tests/A criptografia RSA 512-bit é segura para produção?
RSA 512-bit é considerado inseguro para uso em produção — chaves desse tamanho podem ser fatoradas com recursos computacionais modernos. No contexto deste projeto educacional/demonstrativo, serve para ilustrar o conceito de criptografia híbrida. Para produção, use RSA 2048-bit ou superior (ou curvas elípticas).
O chat persiste mensagens?
Não. O armazenamento é totalmente in-memory no servidor Sanic. Ao encerrar o servidor, todas as mensagens e sessões são perdidas.
Posso usar sem Rich instalado?
Sim. O cliente possui fallback para renderização padrão quando Rich não está disponível. A experiência é melhor com Rich (cores, formatação), mas funciona sem ela.
Como funciona a autenticação?
O servidor aceita uma senha via flag -p no cmd_chat serve. Clientes devem fornecer a mesma senha no cmd_chat connect. A validação ocorre na conexão WebSocket.
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
MIT License - você pode usar, copiar, modificar e distribuir este código.
José Enoque Costa de Sousa
