Criptografia e Proteção de Dados (LGPD)
Pilar: 01 — Arquitetura, Stack e Segurança
Status: 🟢 Implementado
Última Revisão Técnica: 2026-08-03
Módulos Conectados:gatein-server(app/core/security.py,app/core/sqids.py),gatein-app(react-native-encrypted-storage)
1. Visão Geral da Estratégia de Proteção de Dados
A arquitetura de segurança do Gatein assegura a proteção da informação em três estados: em trânsito (In-Transit), em repouso (At-Rest) e em exibição/logs (In-Use/Audit). Toda a coleta de dados pessoais de motoristas (CPF, CNH, Telefone e Localização GPS) é alinhada com as diretrizes da Lei Geral de Proteção de Dados (LGPD - Lei nº 13.709/2018).
1.1 Diagrama de Proteção Criptográfica
graph TD
subgraph "Trânsito de Dados (In-Transit)"
MOB[App Mobile] -->|TLS 1.3 / HTTPS / Secure Websocket| API[FastAPI Server]
WEB[Web App] -->|TLS 1.3 / HTTPS| API
API -->|SSL Encrypted Connection| DB[(PostgreSQL Database)]
API -->|TLS Encrypted Connection| RDS[(Redis Cache)]
end
subgraph "Proteção em Repouso (At-Rest)"
DB --> PWD[Senhas de Usuários: Bcrypt Hash]
DB --> KEY[API Keys: Bcrypt Hash + Prefixo Visual]
DB --> TKT[Tickets: JSONB Snapshot Imutável]
end
subgraph "Ofuscação e Mascaramento (In-Use)"
API --> SQD[IDs de Banco -> Sqids Hashes Ex: w8x9k2m1]
API --> LOG[Mascaramento em Logs Ex: 123*** / Rob*** Sil***]
end
2. Ofuscação de Identificadores (Algoritmo Sqids)
Para prevenir ataques de enumeração horizontal de IDs sequenciais de banco de dados (IDOR) em endpoints públicos, o ecossistema utiliza a biblioteca Sqids:
- Configuração de Alfabeto e Tamanho Mínimo:
- O utilitário
app/core/sqids.pyinicializa um gerador determinístico com alfabeto embaralhado e tamanho mínimo de hash de 8 caracteres.
- O utilitário
- Transformação Biunívoca:
encode_id(10482)$\rightarrow$"w8x9k2m1"decode_id("w8x9k2m1")$\rightarrow$10482
- Escopo de Uso:
- Camada Externa (APIs REST, Payloads FCM, URLs): Exibe obrigatoriamente os hashes Sqids.
- Camada Interna (SQLAlchemy, Queries PostgreSQL, Foreign Keys): Manipula nativamente os IDs numéricos ou UUIDs de alta performance.
3. Mascaramento e Proteção de Dados Pessoais (LGPD)
3.1 Sanitização e Mascaramento de Identificadores em Logs
Para evitar o vazamento acidental de dados PII (Personally Identifiable Information) em sistemas de monitoramento e agregadores de log:
- Nome do Motorista: Processado pelo utilitário
mask_full_name("Roberto Silva Santos")$\rightarrow$"Rob*** Sil*** San***". - CPF (
tax_id): Exibido nos logs apenas com os 3 primeiros dígitos:"123***". - Telefone: Mascarado para exibir apenas o DDD e os últimos 2 dígitos:
"+55 11 *****-**88".
3.2 Criptografia de Credenciais e Senhas (Bcrypt)
- Senhas de Usuários: Processadas via algoritmo
bcryptcom salt aleatório (hash_secret()). Nunca são gravadas senhas em texto plano. - Chaves de API (
API Keys): Ao gerar um novo par de chaves, o servidor exibe o segredo em texto claro uma única vez. No banco de dados PostgreSQL, é gravado exclusivamente obcrypthash (api_key_hash).
4. Comunicação Segura TLS e Armazenamento Local
4.1 Segurança em Trânsito (TLS/HTTPS)
- Todos os pontos de extremidade da API exigem conexões TLS 1.3 / HTTPS com algoritmos de cifra modernos (AES-256-GCM, CHACHA20-POLY1305).
- Conexões WebSocket para Socket.IO utilizam suporte seguro via
wss://.
4.2 Armazenamento Seguro no Dispositivo Mobile
No aplicativo mobile (gatein-app), tokens JWT e dados sensíveis do motorista nunca são salvos em plaintext no AsyncStorage padrão. O app utiliza a biblioteca react-native-encrypted-storage:
- iOS: Salvo no Keychain nativo com proteção por enclave de hardware.
- Android: Salvo com criptografia AES-256 via Android Keystore System.
5. Política de Retenção e Expurgo de Dados (Data Retention)
Em conformidade com o princípio de minimização de dados da LGPD:
| Categoria de Dado | Período de Retenção | Mecanismo de Expurgo |
|---|---|---|
| Logs de Rastreamento GPS | 90 dias após conclusão da viagem | Job automático do APScheduler (prune_old_location_logs). |
| Códigos OTP de SMS | 300 segundos (5 minutos) | Exclusão automática por TTL nativo no Redis. |
| Tokens JWT de Integração | 180 segundos (3 minutos) | Expirados automaticamente por reivindicação de timestamp exp. |
| Solicitações de Cadastro Incompletas | 30 dias | Job mensal de limpeza da tabela register_requests. |
6. Regras de Negócio Explícitas (RN-CRY-XXX)
RN-CRY-001: Proibição de IDs Sequenciais Brutos em APIs Públicas
Nenhum endpoint público ou mobile pode retornar identificadores inteiros primários de banco de dados (id). Todos os atributos de ID serializados nos schemas Pydantic devem passar pela função encode_id().
RN-CRY-002: Mascaramento Obrigatório de PII em Logs de Servidor
É estritamente proibido imprimir nomes completos, senhas em texto plano, CPFs não-mascarados ou números de CNH nas saídas de log de produção. Todos os logs de exceção ou rastreamento devem obrigatoriamente invocar os formatadores de mascaramento.
RN-CRY-003: Impossibilidade de Leitura Reversa de API Keys
O sistema não possui nenhum algoritmo de descriptografia reversa para api_key_hash. Caso um cliente perca sua chave de API, a única alternativa disponível é a revogação e regeneração de um novo par de chaves.
RN-CRY-004: Retenção Máxima de 90 Dias para Telemetria de Geofence
Dados de geolocalização coletados em segundo plano durante a execução de viagens ativas são expurgados do banco de dados relacional 90 dias após a transição da viagem para COMPLETED.