Ataques de fuerza bruta en línea
De hecho, los sitios que no implementan algún tipo de protección contra los ataques de fuerza bruta en línea están filtrando las contraseñas de sus usuarios. Muchos sitios no tienen ningún tipo de protección, y muchos otros lo tienen.
El bloqueo simple tiene problemas:
- Si bloqueamos la IP del usuario después de x intentos fallidos, una botnet fuerte de 10'000 puede probar las contraseñas x * 10'000. Con 100 000 intentos, muchas de las contraseñas más débiles ya están descifradas.
- Si bloqueamos la cuenta del usuario después de x intentos fallidos, cualquier atacante puede bloquear la cuenta de cualquier usuario.
Esto implica que la defensa debe ser más sofisticada, o simplemente podemos ignorar la defensa e intentar culpar al usuario cuando finalmente explote, lo que es menos ético. Los esquemas más sofisticados utilizan una combinación de detección de actividades sospechosas y requisitos de inicio de sesión condicionalmente más fuertes.
Para detectar actividades sospechosas, rastreamos signos positivos basados en inicios de sesión exitosos pasados, como los ISP del usuario y algún identificador de los dispositivos con los que el usuario inició sesión anteriormente. También podemos utilizar señales negativas, como IPs de ISP o países "contaminados", o un rápido aumento en los intentos de inicio de sesión.
En términos de requisitos de inicio de sesión más estrictos, podemos utilizar tiempos de espera cortos, captchas, autenticación multifactor e incluso listas negras.
Ataques de fuerza bruta sin conexión
Todas las medidas anteriores son inútiles una vez que nuestro administrador del sistema descontento vende una copia de nuestra base de datos de contraseñas en el mercado negro, porque entonces el atacante solo puede descifrar la contraseña y ver si coincide con la base de datos. Descifrar los hashes puede ser barato y fácil o aún fácil pero muy muy costoso, dependiendo de cómo hemosheado las contraseñas
Consulte: ¿Cómo hash seguro de contraseñas?
Sal: para hacer que sea más difícil para el atacante descifrar toda la base de datos, usamos una sal, que hace que cada hash sea un poco único. Cada usuario tiene una sal diferente, que se almacena junto al hash. Esto significa que el atacante no puede simplemente calcular el hash de una contraseña y compararla con el hash de cada usuario, sino que el atacante tiene que calcular un hash nuevo para cada contraseña que intenta contra cada usuario. El uso de un salt no aumenta el costo para obtener la contraseña de un solo usuario.
Hash caro: ningún atacante puede forzar la fuerza bruta 100 mil millones de contraseñas por segundo, a menos que el esquema de hash haya sido creado por un imbécil (lo cual es plausible). Algunos atacantes pueden calcular 100 mil millones de hashes básicos como sha256 por segundo, pero la solución es simplemente no usar un hash básico para codificar la contraseña. Una solución trivial es que nuestro hash no es en realidad hash =sha256(password, salt)
, sino que es hash =sha256(sha256(sha256(.......(password, salt)...)password, salt)password, salt)
, donde usamos alrededor de 100,000 iteraciones de sha256, lo que hace que cualquier ataque sea 100'000 veces más caro. En realidad, esta defensa es demasiado simple para romperla con un hardware especializado, por lo que en la práctica usamos las Funciones de derivación de claves especiales tike bcrypt
y scrypt
para mezclar múltiples hashes básicos de formas que son costosas de calcular para cualquier atacante, independientemente del hardware.