Skip to content

KevenMelo/cryptography_chalg

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔐 Cryptography Challenge - Sistema de Pagamentos

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 (userDocument e creditCardToken) 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.

✅ Solução Implementada

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

🚀 Funcionalidades

  • ✅ 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)

🎯 Como Resolve o Desafio (PROBLEM.md)

Requisitos Atendidos

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

Exemplo de Funcionamento

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).

🏗️ Arquitetura

├── 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

🔧 Pré-requisitos

OU para desenvolvimento local:

  • Go 1.21+
  • SQLite3

🚀 Como Executar

Com Docker (Recomendado)

  1. Clone o repositório:

    git clone <repository-url>
    cd cryptography_chalg
  2. Configure as variáveis de ambiente:

    cp .env.example .env
    # Edite o arquivo .env conforme necessário
  3. 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
  4. A aplicação estará disponível em:

Desenvolvimento Local

  1. Instale as dependências:

    go mod download
  2. Configure a variável de ambiente:

    export AES_KEY="12345678901234567890123456789012"
  3. Execute a aplicação:

    go run cmd/main.go

📡 Endpoints da API

Criar Pagamento

POST /payments
Content-Type: application/json

{
  "user_document": "12345678901",
  "credit_card_token": "1234567890123456",
  "value": 1000
}

Listar Todos os Pagamentos

GET /payments/all

Buscar Pagamento por ID

GET /payments/{id}

🧪 Testando a API

Usando curl:

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

Configuração de Produção

Variáveis de Ambiente Importantes

# 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

Considerações de Segurança para Produção

  1. CORS: Remover * e especificar domínios permitidos
  2. TLS: Configurar HTTPS com certificados válidos
  3. Rate Limiting: Ajustar limites conforme necessário
  4. Logging: Implementar logging estruturado e centralizado
  5. Backup: Configurar backup automático do banco de dados

🐛 Troubleshooting

Problemas Comuns

  1. Erro de chave AES:

    Erro: a chave deve ter 32 bytes
    

    Solução: Verificar se AES_KEY tem exatamente 32 caracteres

  2. Erro de permissão no SQLite:

    permission denied
    

    Solução: Verificar permissões do diretório ./data

  3. Rate limit atingido:

    Rate limit exceeded
    

    Solução: Aguardar 1 minuto ou ajustar configurações

📝 TODO / Melhorias Futuras

  • 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

� Referências do Desafio

�👨‍💻 Autor

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!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published