Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔓 CajeroSeguro - Sistema Anti-Hacker (Versión Educativa)

Hackers Intentando Hackear

🎯 ¿Qué aprenderás?

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

📚 Pasos para Resolver

Paso 1: Clase Cuenta

Archivo: Cuenta.java

Atributos:

  • titular (String) - nombre del propietario
  • PIN (String) - código secreto
  • saldo (double) - cantidad de dinero
  • intentosFallidos (int) - contador de fallos
  • bloqueada (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 cuenta

Paso 2: Clase SistemaSeguridad

Archivo: 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
}

Paso 3: Clase EasterEggs

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!!!";
    }
}

Paso 4: Clase Cajero

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
    }
}

Paso 5: Clase Main

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();
    }
}

🎮 Pruebas Recomendadas

Test 1: PIN Correcto

PIN: 1234
→ ✅ PIN CORRECTO
→ Mostrar menú de operaciones

Test 2: PIN Incorrecto (3 veces)

PIN: 5678 (intento 1)
PIN: 9999 (intento 2)
PIN: 0000 (intento 3)
→ 🚨 CUENTA BLOQUEADA

Test 3: Easter Egg

PIN: contraseña
→ 🤦 Acabas de poner CONTRASEÑA como PIN
→ Suma intento fallido

Test 4: SQL Injection

PIN: 123' OR '1'='1
→ 😏 Conozco a Kevin Mitnick y tú no eres él
→ Suma intento fallido

📋 Checklist de Implementación

  • 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

💡 Conceptos Clave

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

🚀 Siguientes Pasos

  1. Implementa Cuenta.java - Atributos, constructor, getters
  2. Implementa SistemaSeguridad.java - Métodos de validación
  3. Implementa EasterEggs.java - Respuestas graciosas
  4. Implementa Cajero.java - Lógica de seguridad
  5. Implementa Main.java - Menú y bucle principal
  6. Prueba todos los casos - Intenta "hackear"

📊 Diagrama de Flujo

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 ✅

✨ Extra: Respuestas Cómicas

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"

🧪 Pruebas Unitarias (JUnit + JaCoCo)

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

Qué 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

About

Proyecto consolidado: rama main (final) y rama base (fase inicial)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages