Este projeto é uma solução completa para o desafio de criptografia proposto em PROBLEM.md.
📋 Sobre o Desafio: Implementar criptografia transparente em um serviço, garantindo que campos sensíveis (
userDocumentecreditCardToken) sejam automaticamente criptografados durante a persistência no banco de dados e descriptografados na recuperação, sem impactar as camadas de negócio da aplicação.
Este sistema de pagamentos resolve todos os requisitos do desafio através de:
- 🔐 Criptografia Transparente: AES-256 em modo CBC implementada na camada de repositório
- 🏗️ Arquitetura Limpa: Separação clara de responsabilidades (handler/service/repository)
- 📊 CRUD Completo: Create, Read, Update, Delete para entidade Payment
- 🛡️ Segurança Avançada: Rate limiting, CORS, validação de entrada e middleware de segurança
- 🐳 Produção Ready: Containerização Docker e configuração via variáveis de ambiente
- ✅ Criptografia AES-256 em modo CBC para dados sensíveis
- ✅ API RESTful para gerenciamento de pagamentos
- ✅ Middleware de logging, CORS e rate limiting
- ✅ Validação de dados de entrada
- ✅ Banco de dados SQLite para persistência
- ✅ Containerização com Docker
- ✅ Arquitetura em camadas (handler/service/repository)
| Requisito | Implementação | Status |
|---|---|---|
| Criptografia Transparente | Implementada na camada repository - as camadas service e handler trabalham com dados em texto plano |
✅ |
| Campos Sensíveis | userDocument e creditCardToken são automaticamente criptografados/descriptografados |
✅ |
| CRUD Completo | Create, Read, Update, Delete implementados para a entidade Payment | ✅ |
| Algoritmo de Criptografia | AES-256 (criptografia simétrica) conforme sugerido no desafio | ✅ |
Input da API (dados em texto plano):
{
"user_document": "12345678901",
"credit_card_token": "1234567890123456",
"value": 1000
}Armazenamento no Banco (dados criptografados em Base64):
| id | userDocument | creditCardToken | value |
|----|------------------|-----------------|-------|
| 1 | k8vX2mF9pL3qR7s= | n4bY8xC2mP9zA1= | 1000 |
Output da API (dados descriptografados automaticamente):
{
"id": 1,
"user_document": "12345678901",
"credit_card_token": "1234567890123456",
"value": 1000
}🔍 Transparência Total: As camadas de negócio (
service) e apresentação (handler) nunca veem os dados criptografados - a criptografia acontece apenas na camada de persistência (repository).
├── cmd/
│ └── main.go # Entry point da aplicação
├── internal/
│ ├── crypto/ # Funções de criptografia
│ ├── handler/ # HTTP handlers
│ ├── middleware/ # Middlewares HTTP
│ ├── model/ # Modelos de dados
│ ├── repository/ # Camada de persistência
│ ├── router/ # Configuração de rotas
│ └── service/ # Lógica de negócio
├── Dockerfile # Configuração do container
├── docker-compose.yml # Orquestração de serviços
└── README.md # Este arquivo
- Docker 20.10+
- Docker Compose 2.0+
OU para desenvolvimento local:
- Go 1.21+
- SQLite3
-
Clone o repositório:
git clone <repository-url> cd cryptography_chalg
-
Configure as variáveis de ambiente:
cp .env.example .env # Edite o arquivo .env conforme necessário -
Execute com Docker Compose:
# Construir e executar todos os serviços docker-compose up --build # Para executar em background docker-compose up -d --build # Para ver os logs docker-compose logs -f cryptography-api
-
A aplicação estará disponível em:
-
Instale as dependências:
go mod download
-
Configure a variável de ambiente:
export AES_KEY="12345678901234567890123456789012"
-
Execute a aplicação:
go run cmd/main.go
POST /payments
Content-Type: application/json
{
"user_document": "12345678901",
"credit_card_token": "1234567890123456",
"value": 1000
}GET /payments/allGET /payments/{id}curl -X POST http://localhost:8080/payments \
-H "Content-Type: application/json" \
-d '{
"user_document": "12345678901",
"credit_card_token": "1234567890123456",
"value": 1000
}'
curl http://localhost:8080/payments/all
curl http://localhost:8080/payments/1# Chave AES (OBRIGATÓRIA - 32 bytes)
AES_KEY=sua_chave_super_secreta_32_bytes
# Porta da aplicação
PORT=8080
# Configurações de rate limiting
RATE_LIMIT=10
RATE_WINDOW=1m
# Configurações de CORS (produção)
ALLOWED_ORIGINS=https://seu-frontend.com- CORS: Remover
*e especificar domínios permitidos - TLS: Configurar HTTPS com certificados válidos
- Rate Limiting: Ajustar limites conforme necessário
- Logging: Implementar logging estruturado e centralizado
- Backup: Configurar backup automático do banco de dados
-
Erro de chave AES:
Erro: a chave deve ter 32 bytesSolução: Verificar se AES_KEY tem exatamente 32 caracteres
-
Erro de permissão no SQLite:
permission deniedSolução: Verificar permissões do diretório
./data -
Rate limit atingido:
Rate limit exceededSolução: Aguardar 1 minuto ou ajustar configurações
- Implementar autenticação JWT
- Adicionar testes unitários e de integração
- Implementar cache Redis
- Implementar circuit breaker
- Adicionar documentação OpenAPI/Swagger
- Implementar graceful shutdown
- Adicionar validações mais robustas
- 📋 Desafio Original:
PROBLEM.md - 🔐 Algoritmo Utilizado: AES (Advanced Encryption Standard)
- 🏗️ Padrão Arquitetural: Clean Architecture com separação de responsabilidades
Desenvolvido por Keven Melo
Status do Desafio: ✅ COMPLETO - Todos os requisitos do PROBLEM.md foram implementados com sucesso!
⭐ Se este projeto foi útil para você, considere dar uma estrela no repositório!