Sistema de Sorteios ACID
Detalhes do Projeto
- Período:
- 05.2026 — Present
- Link
- acid.org.br
- Client Project
- Criptografia Aplicada
- HMAC-SHA256
- TypeScript
- Next.js
- Prisma
- PostgreSQL
- Turborepo
- Docker
- Auditoria

Impacto em números
Posições derivadas por HMAC, não guardadas
Commit-reveal auditável por terceiros
Alteração retroativa quebra a cadeia
Monorepo com API, web e worker separados
Sobre o projeto
Campanha promocional de seladinhas físicas, com prêmio instantâneo e sorteio final ao vivo. O risco central não é técnico, é reputacional: código previsível, lista de premiados acessível internamente e sorteio sem prova pública geram a percepção de sorteio armado, o que corrói a campanha inteira e expõe a diretoria da associação.
Este é um sistema de registro com valor jurídico: seus dados são a prova de que a promoção foi conduzida corretamente. A constituição do repositório declara explicitamente que integridade e rastreabilidade vencem velocidade de entrega, elegância de código e beleza de tela, sempre.
Derivação por HMAC, sem lista de premiados
posicao_A = HMAC-SHA256(K, lote_id + "|A") mod 250 + 1
posicao_B = HMAC-SHA256(K, lote_id + "|B") mod 250 + 251
Ninguém, nem o administrador, consegue saber qual selo é premiado sem a chave mestra. E a distribuição é verificável depois por qualquer auditor que receba K.
Commit-reveal no sorteio final. A impressão digital da semente é publicada antes do sorteio e revelada depois, então qualquer pessoa recalcula e confirma o resultado. O sistema também suporta semente derivada da Loteria Federal.
Log à prova de adulteração. Cada registro guarda hash = SHA256(hash_anterior + conteudo), e qualquer alteração retroativa quebra a cadeia.
Outras decisões: tentativa de ativação é registrada mesmo quando falha, porque a ausência de evento também é dado. OTP por sessão valida o consumidor sem exigir cadastro pesado. CPF restrito bloqueia quem a regulamentação impede. E o projeto evoluiu para monorepo Turborepo, separando API, web e worker quando o painel da gráfica justificou.
O desafio
Projetar um sistema onde a ausência de informação é a própria feature de segurança. O instinto de engenheiro é guardar tudo, e aqui guardar a lista de premiados seria o vetor de fraude.
Precisei inverter o modelo mental: derivar em vez de armazenar, provar em vez de afirmar, e registrar até a tentativa que falhou. Foi o projeto que mais me ensinou a pensar em ameaça em vez de caso feliz.
Resultados
Nenhuma lista de premiados armazenada. Sorteio final verificável publicamente por commit-reveal, trilha de auditoria à prova de adulteração por encadeamento de hash e base de consumidores da região coletada com consentimento LGPD.
Stack técnica
HMAC-SHA256
Derivação determinística das posições premiadas a partir de uma chave mestra secreta.
Commit-reveal
Publicação prévia da impressão digital da semente e revelação posterior para verificação pública.
Log hash-encadeado
SHA256 do hash anterior somado ao conteúdo, de modo que alteração retroativa quebra a cadeia.
Next.js 16 e Prisma 7
UI e API unificadas, com PostgreSQL como sistema de registro.
Turborepo
Monorepo com api, web e worker separados, mais packages compartilhados.
Docker Compose
Postgres real e seed idempotente, com ambiente de teste espelhando produção.
Galeria(2)

