Pular para o conteúdo

Caixa Eletrônico (ATM) em C#

Simulação de caixa eletrônico em console, C# puro (.NET 8): autenticação por cartão + PIN com hash PBKDF2, saque com limite por transação e por dia, extrato, troca de PIN e telefone, 39 testes automatizados.

2026-09-13
C#.NETSegurançaxUnit

Visão geral

Aplicação de console que simula um caixa eletrônico de verdade: autenticação por número de cartão e PIN de 4 dígitos, consulta de saldo, saque (com limite de R$ 1.000 por transação e 10 saques por dia), saque rápido (R$ 20, 50 ou 100), extrato detalhado, troca de PIN e cadastro de telefone. Todos os itens da versão "mais complexa" do enunciado original estão implementados, não só o básico.

Segurança do PIN

O PIN nunca é armazenado nem comparado em texto puro: hash via PBKDF2 (SHA-256, 100 mil iterações) com salt aleatório de 16 bytes por conta, e comparação em tempo constante na verificação. Cartão inexistente e PIN errado lançam a mesma exceção, para um atacante não conseguir distinguir os dois casos pela mensagem de erro.

Arquitetura

Camadas UI → Service → Repository → Modelo. A regra de negócio (limite de saque, validação de PIN, troca de telefone) vive nos modelos de domínio, não na service nem na UI. Persistência em JSON via System.Text.Json, mesmo padrão do projeto Lista de Tarefas.

Testes

39 testes automatizados cobrindo domínio (regras de saque e limite diário), segurança do hash de PIN, repositório (round-trip real em arquivo, com uma segunda instância lendo o que a primeira gravou) e serviço (autenticação, saque persistindo de verdade, extrato).