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