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:
- ¿Cuántas combinaciones tiene un PIN de 4 cifras?
- Con 3 intentos cada 10 segundos, ¿cuántos segundos tarda probar 10 000 combinaciones? Divide entre 3 y multiplica por 10.
- 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
- Escribe tres PIN incorrectos seguidos. Debe aparecer el bloqueo.
- Escribe el PIN correcto durante el bloqueo. Debe seguir bloqueado.
- 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.