Fuerza bruta: por qué importan los intentos y el bloqueo

Calcula cuántas combinaciones tiene un PIN y añade un bloqueo temporal tras varios intentos fallidos.

Qué vas a construir

El control de acceso de la clase anterior, con un límite de 3 intentos. Tras el tercer fallo, el sistema ignora los intentos durante 10 segundos.

Lo que aprendes

  • Qué es un ataque de fuerza bruta: probar todas las combinaciones posibles.
  • Cuántas combinaciones tiene un PIN de 4 y de 6 cifras.
  • Cómo usar millis() para esperar sin detener el programa.

Idea clave

Un PIN de 4 cifras tiene 10 000 combinaciones (0000 a 9999). Uno de 6 cifras tiene 1 000 000. Si no hay límite de intentos, el atacante puede probarlas todas. Un bloqueo cambia el cálculo: con 3 intentos cada 10 segundos, el PIN de 4 cifras tardaría unas 9 horas en el peor caso, y el de 6 cifras unos 39 días.

Eso no es seguridad perfecta, pero obliga al atacante a esperar, y eso casi siempre lo detiene.

Materiales en Tinkercad

  • Arduino Uno R3
  • LED verde y rojo (de la clase anterior)
  • Monitor serie

Paso 1: Cálculo a mano

Antes de programar, calcula en tu cuaderno:

  1. ¿Cuántas combinaciones tiene un PIN de 4 cifras?
  2. Con 3 intentos cada 10 segundos, ¿cuántos segundos tarda probar 10 000 combinaciones? Divide entre 3 y multiplica por 10.
  3. Compara con tu resultado: ¿cuántas horas son?

Paso 2: Código con bloqueo

const String PIN_CORRECTO = "4821";
const int MAX_INTENTOS = 3;
const unsigned long ESPERA = 10000;   // 10 segundos en milisegundos

int fallos = 0;
unsigned long bloqueadoHasta = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("Escribe el PIN y pulsa Enter:");
}

void loop() {
  if (Serial.available()) {
    String intento = Serial.readStringUntil('\n');
    intento.trim();

    if (millis() < bloqueadoHasta) {
      Serial.println("Bloqueado. Espera.");
      return;
    }

    if (intento == PIN_CORRECTO) {
      fallos = 0;
      Serial.println("Acceso concedido");
    } else {
      fallos++;
      Serial.println("Acceso denegado");

      if (fallos >= MAX_INTENTOS) {
        bloqueadoHasta = millis() + ESPERA;
        fallos = 0;
        Serial.println("Demasiados intentos. Bloqueado 10 s.");
      }
    }
  }
}

Paso 3: Prueba

  1. Escribe tres PIN incorrectos seguidos. Debe aparecer el bloqueo.
  2. Escribe el PIN correcto durante el bloqueo. Debe seguir bloqueado.
  3. Espera 10 segundos y escribe el PIN correcto. Debe entrar.

Cómo sabes que lo lograste

  • Tras 3 fallos aparece el mensaje de bloqueo.
  • Durante el bloqueo, el PIN correcto no funciona.
  • Tu cálculo de horas coincide con el de la tabla de la idea clave.

Qué salió mal

El bloqueo nunca termina. Revisa que ESPERA esté en milisegundos (10 000 y no 10).

El contador no se reinicia. Un acceso correcto debe poner fallos = 0. Revisa que esa línea esté dentro del if.

Siguiente clase

En la siguiente clase vas a guardar el PIN como un hash, para que el código no contenga el PIN en texto claro.