# Segurança e LGPD — estado atual

## O que já está implementado e testado (24 testes do backend + 13 do domínio)
| Tema (OWASP) | Medida |
|---|---|
| Senhas | scrypt (N=2^15, r=8, p=1), sal único, *pepper* do servidor via HMAC, rehash automático se os parâmetros subirem, comparação em tempo constante |
| Enumeração de contas | Mensagem igual para e-mail inexistente e senha errada; hash “falso” para igualar o tempo de resposta |
| Força bruta | Limite por conta (5 por 15 min) e por IP (30 por 10 min) no login; limite de cadastros por IP; resposta `429` com `Retry-After` |
| Sessão | Access token JWT HS256 de 15 min (somente HS256, confere `exp`, `nbf`, `iss`, `aud`, rotação de chave por `kid`); refresh token opaco, só o hash é guardado, rotação a cada uso e **detecção de reuso** que derruba a família; logout encerra o access token na hora |
| Autenticação forte | TOTP (RFC 6238, testado com os vetores oficiais), código de uso único (anti-replay), 8 códigos de recuperação de uso único, segredo criptografado em repouso (AES-256-GCM) |
| Autorização | Papéis (cliente, vendedor, admin) e permissões; vendedor só altera os próprios produtos; produto alheio responde como “não encontrado” |
| Entrada | Validação no servidor com o mesmo código da web e do app; consultas SQL parametrizadas; preços inteiros; limite de corpo de 100 KB |
| Cabeçalhos / CORS | `helmet`; CORS só para origens configuradas; métodos e cabeçalhos restritos |
| Erros | Formato estável; erros internos não vazam detalhes (só um `requestId`) |
| Auditoria | Cadastro, login (ok/falha), 2FA, reuso de refresh e saída geral ficam em `audit_log` |
| Configuração | Falha na partida se faltar segredo ou se for curto; nada de segredo no código |
| Recuperação de senha | Link de uso único (1 h) com hash guardado, resposta idêntica exista ou não a conta, limite por e-mail e por IP, novo pedido invalida o anterior, troca encerra todas as sessões e avisa por e-mail |
| E-mail | Verificação por link de uso único (24 h); exigida para virar vendedor |
| LGPD | Aceite dos termos com versão e data (`consents`); **exportação dos dados** (`GET /me/export`, sem hashes nem segredos); **exclusão por anonimização** (`DELETE /me`: apaga nome e e-mail, encerra sessões, arquiva produtos e tira da busca; pedidos ficam para obrigações fiscais, sem identidade) |
| Vendedores (KYC) | CPF/CNPJ validados; documento **criptografado** (AES-256-GCM) e HMAC para impedir duplicidade; visão pública com documento mascarado; aprovação só por admin |
| Sessão no site | Refresh token em cookie `httpOnly` + `SameSite=Strict` + `Secure` em produção, só nas rotas `/api/session`; troca por origem (anti-CSRF); access token só em memória (nada de `localStorage` para tokens) |
| Sessão no app | Tokens no cofre do aparelho (`expo-secure-store`: Keychain/Keystore) |
| Cupons | Uso atômico no banco: chave primária impede o 2º uso da pessoa e o `UPDATE` condicional respeita o limite mesmo com compras simultâneas; recusa sempre com a mesma mensagem (não revela se o código existe); liberação automática se o pagamento falhar |
| Fotos | URL assinada de 5 min com tipo e tamanho travados; chave isolada por vendedor; a API nunca recebe o arquivo |
| Pedidos | Preço e frete sempre calculados no servidor; estoque reservado de forma atômica; idempotência contra duplo envio; máquina de estados (não pula etapas); comprador e vendedor só veem os próprios pedidos; comissão invisível para o cliente |
| Pagamentos | A API nunca vê o número do cartão (só token do provedor); webhook com assinatura conferida sobre o corpo bruto e tratamento idempotente; provedores “fake” **bloqueados em produção** na configuração |

## O que ainda falta (não está pronto)
- **Adaptadores reais** de pagamento (com divisão para vendedores) e de frete: dependem do provedor que você escolher.
- Repasse (pagamento) ao vendedor, devoluções, disputas e antifraude de pedidos.
- KYC automático (consulta de CNPJ, prova de vida) e antecedentes; hoje a análise é manual.
- Ligar web e app à API; testes de integração ponta a ponta.
- Proteção contra bots (CAPTCHA/desafio) no cadastro e login; WAF na frente.
- Cofre de segredos / KMS; rotação automatizada de chaves; backups e restauração testados.
- Observabilidade: logs estruturados centralizados, métricas e alertas (itens da Fase 12).
- Testes de integração com Postgres, Redis e OpenSearch reais; teste de carga; revisão externa de segurança (pentest) antes de abrir ao público.
