Este proyecto es una versión simplificada y educativa del sistema de cajero automático con seguridad anti-hacker. Es perfecto para aprender:
- ✅ Validación de entrada del usuario
- ✅ Manejo de intentos fallidos
- ✅ Detección de patrones sospechosos
- ✅ Lógica condicional avanzada
- ✅ Encapsulación y seguridad
Archivo: Cuenta.java
Atributos:
titular(String) - nombre del propietarioPIN(String) - código secretosaldo(double) - cantidad de dinerointentosFallidos(int) - contador de fallosbloqueada(boolean) - estado de bloqueo
Métodos:
public Cuenta(String titular, String PIN, double saldo)
public boolean validarPIN(String pin) // Compara PIN
public boolean esbloqueada() // Verifica bloqueo
public void bloquear() // Bloquea cuenta
public void incrementarIntentos() // Suma intento fallido
public void resetearIntentos() // Reset tras éxito
public String getInfo() // Info de cuentaArchivo: SistemaSeguridad.java
Métodos de validación:
public boolean esContraseñaDebil(String pin) {
// Retorna true si:
// - Tiene menos de 4 caracteres
// - Es "1234"
// - Es "0000"
// - Es la palabra "contraseña"
}
public boolean contieneInyeccionSQL(String texto) {
// Detecta patrones sospechosos como:
// - "OR '1'='1"
// - "DROP"
// - "DELETE"
// - ";"
}
public boolean esMontosospechoso(double monto, double saldo) {
// Retorna true si:
// - monto == 0
// - monto < 0
// - monto > saldo
// - monto > saldo * 2
}
public String detectarFraude(String intento) {
// Retorna: "BAJO", "MEDIO" o "ALTO"
// según los riesgos detectados
}Archivo: EasterEggs.java
public class EasterEggs {
// Respuestas a PINs débiles
public static String responderAPIN(String pin) {
if (pin.equals("1234"))
return "🎩 Como la mitad del planeta...";
if (pin.equals("0000"))
return "🚨 ¡¡¡CLARO!!! El PIN es 0000";
if (pin.equals("contraseña"))
return "🤦 Acabas de poner CONTRASEÑA como PIN";
return null;
}
// Respuestas a montos sospechosos
public static String responderAMonto(double monto, double saldo) {
if (monto == 0)
return "🎩 Ni siquiera el aire cuesta eso";
if (monto > saldo)
return "💸 No tienes dinero suficiente";
if (monto > saldo * 100)
return "💸 Tendrías que vender un riñón";
return null;
}
// Respuestas a intentos de hackeo
public static String responderAlHackeo(String tipo) {
if (tipo.equals("SQL"))
return "😏 Conozco a Kevin Mitnick y tú no eres él";
if (tipo.equals("CONTRASEÑA_DEBIL"))
return "🤦 Contraseña demasiado débil";
return "🚨 ¡¡¡INTENTO DE HACKEO DETECTADO!!!";
}
}Archivo: Cajero.java
Estructura básica:
public class Cajero {
private Cuenta cuenta;
private SistemaSeguridad seguridad;
public Cajero(Cuenta cuenta) {
this.cuenta = cuenta;
this.seguridad = new SistemaSeguridad();
}
public void operacion() {
// Validar si está bloqueada
if (cuenta.esbloqueada()) {
System.out.println("🚨 CUENTA BLOQUEADA");
return;
}
// Pedir PIN
String pin = pedirPIN();
// DEFENSA 1: Detectar fraude
String riesgo = seguridad.detectarFraude(pin);
if (!riesgo.equals("BAJO")) {
System.out.println(EasterEggs.responderAlHackeo(riesgo));
cuenta.incrementarIntentos();
if (cuenta.intentosFallidos >= 3) {
cuenta.bloquear();
mostrarMensajeBloqueo();
}
return;
}
// DEFENSA 2: Validar PIN
if (!cuenta.validarPIN(pin)) {
System.out.println("❌ PIN INCORRECTO");
cuenta.incrementarIntentos();
if (cuenta.intentosFallidos >= 3) {
cuenta.bloquear();
mostrarMensajeBloqueo();
}
return;
}
// PIN CORRECTO
cuenta.resetearIntentos();
System.out.println("✅ PIN CORRECTO");
mostrarMenu();
}
private String pedirPIN() {
System.out.print("Introduce tu PIN: ");
// Usar Scanner aquí
return "";
}
private void mostrarMensajeBloqueo() {
System.out.println("""
╔════════════════════════════════════╗
║ 🚨 CUENTA BLOQUEADA 🚨 ║
║ ¿Olvidaste el PIN? Pues yo ║
║ Llama al 666 ║
╚════════════════════════════════════╝""");
}
private void mostrarMenu() {
// Implementar menú de operaciones
}
}Archivo: Main.java
public class Main {
public static void main(String[] args) {
// Crear cuenta de ejemplo
Cuenta miCuenta = new Cuenta("Juan", "1234", 1000.00);
// Crear cajero
Cajero cajero = new Cajero(miCuenta);
// Menú principal
Scanner scanner = new Scanner(System.in);
System.out.println("╔════════════════════════════════════╗");
System.out.println("║ 🏦 CAJERO SEGURO - ANTI-HACKER ║");
System.out.println("╚════════════════════════════════════╝");
boolean continuar = true;
while (continuar) {
System.out.println("\n1. Realizar operación");
System.out.println("2. Ver saldo");
System.out.println("3. Salir");
System.out.print("Elige una opción: ");
int opcion = scanner.nextInt();
scanner.nextLine();
switch (opcion) {
case 1 -> cajero.operacion();
case 2 -> System.out.println(miCuenta.getInfo());
case 3 -> continuar = false;
default -> System.out.println("Opción inválida");
}
}
scanner.close();
}
}PIN: 1234
→ ✅ PIN CORRECTO
→ Mostrar menú de operaciones
PIN: 5678 (intento 1)
PIN: 9999 (intento 2)
PIN: 0000 (intento 3)
→ 🚨 CUENTA BLOQUEADA
PIN: contraseña
→ 🤦 Acabas de poner CONTRASEÑA como PIN
→ Suma intento fallido
PIN: 123' OR '1'='1
→ 😏 Conozco a Kevin Mitnick y tú no eres él
→ Suma intento fallido
- Clase Cuenta creada y funcional
- Clase SistemaSeguridad con detección de patrones
- Clase EasterEggs con respuestas cómicas
- Clase Cajero con 3 capas de defensa
- Main con menú principal
- Validación de PIN débil (1234, 0000, contraseña)
- Detección de SQL injection
- Detección de montos sospechosos
- Bloqueo tras 3 intentos fallidos
- Mensaje épico de bloqueo
| Concepto | Dónde | Para qué |
|---|---|---|
| Validación | SistemaSeguridad | Detectar patrones sospechosos |
| Encapsulación | Cuenta | Proteger datos sensibles |
| Lógica condicional | Cajero | Tomar decisiones de seguridad |
| Contadores | Cuenta.intentosFallidos | Rastrear intentos |
| Estados | Cuenta.bloqueada | Gestionar ciclo de vida |
| Easter eggs | EasterEggs | Hacer aprendizaje divertido |
- Implementa Cuenta.java - Atributos, constructor, getters
- Implementa SistemaSeguridad.java - Métodos de validación
- Implementa EasterEggs.java - Respuestas graciosas
- Implementa Cajero.java - Lógica de seguridad
- Implementa Main.java - Menú y bucle principal
- Prueba todos los casos - Intenta "hackear"
Usuario abre cajero
↓
¿Cuenta bloqueada?
Sí → Mostrar bloqueo ❌
No ↓
Introduce PIN
↓
¿Fraude detectado?
Sí → Mensaje cómico + intento fallido
No ↓
¿PIN correcto?
No → Intento fallido (¿3 veces? → Bloquear)
Sí ↓
Mostrar menú de operaciones ✅
PIN "1234" → "🎩 Como la mitad del planeta..."
PIN "0000" → "🚨 ¡¡¡CLARO!!! El PIN es 0000"
PIN "contraseña" → "🤦 Acabas de poner CONTRASEÑA como PIN"
SQL injection → "😏 Conozco a Kevin Mitnick y tú no eres él"
Monto = 0 → "🎩 Ni siquiera el aire cuesta eso"
Monto > saldo → "💸 No tienes dinero suficiente"
El proyecto incluye pruebas unitarias automáticas. Para ejecutarlas:
# Ejecutar todas las pruebas
mvn clean test
# Ver reporte de cobertura
# Se genera en: target/site/jacoco/index.htmlQué se prueba:
- ✅ Clase
Cuenta→ ~10 tests - ✅ Clase
SistemaSeguridad→ ~16 tests - ✅ Clase
EasterEggs→ ~14 tests - ✅ Clase
Cajero→ ~16 tests
Cobertura esperada: 85%+
¡A implementar el cajero más seguro del planeta! 🔐
Empezando por: crear Cuenta.java
