validar usuarios usuario una solicitar sesion pantalla intentos inicio hacer crear contraseña con como java login throttling throttle

una - usuarios en java



¿Cómo acelerar los intentos de inicio de sesión en Java webapp? (7)

Quiero implementar un mecanismo eficiente para acelerar los intentos de inicio de sesión en mi aplicación web Java, para evitar ataques de fuerza bruta en las cuentas de usuario.

Jeff explicó el porqué, pero no el cómo.

Simon Willison mostró una implementación en Python para Django : Eso realmente no me ayuda, ya que no puedo usar memcached ni Django.

Transmitir sus ideas desde cero tampoco parece una gran idea; no quiero reinventar la rueda.

Encontré una implementación Java , aunque parece bastante ingenua: en lugar de una caché LRU, solo borra todas las entradas después de 15 minutos.

EHCache podría ser una alternativa para memcached, pero no tengo ninguna experiencia con eso y realmente no quiero incorporar otra tecnología si hay mejores alternativas para esta tarea.

Entonces, ¿cuál es una buena manera de implementar la regulación de inicio de sesión en Java?


¿Qué pasa con un aumento exponencial en el tiempo entre los intentos de inicio de sesión?


Acabo de completar el curso de seguridad web ejecutado por seguridad de aspecto y una de las sugerencias que surgió fue simplemente incluir un retraso natural en cualquier intento de inicio de sesión, la teoría es que un retraso de 1 o 2 segundos no es nada para un verdadero -usuario, pero obstaculizará seriamente los ataques de fuerza bruta.


Creo que incluso EHCache está matando una mosca con una bomba de napalm. El problema es simple y también lo es la implementación.

Sugiero usar un filtro de servlet en el nivel superior para que se realice el menor procesamiento posible.

Crea una clase para almacenar lo siguiente:

  • El número de intentos (conteo)
  • El tiempo

Ahora, el código es simple en un bloque sunchronized:

if userid not in attemptMap: attemptMap.add ( userid, new attemptItem ( userid, 1, now ) ) else tmp = attemptMap.get ( userid ) if (acquire lock for tmp) : if tmp.time + 30 > now : tmp.count = 0 tmp.time = now tmp.count++ if tmp.count > 3 : error=true release lock for tmp else : error=true

eso es hombre (siempre que el código esté sincronizado).


He utilizado un campo de conteo de Intento de inicio de sesión con detalles de usuario. Cuando llega a 50, las contraseñas correctas son rechazadas y el usuario tiene que realizar un restablecimiento de contraseña.


EHCache es bastante bueno, y lo más importante, no está escrito por usted, por lo que no tiene que volver a implementar las funciones y, posiblemente, equivocarse.

Mi solución implicaría EHCache o algo más simple (si era una aplicación pequeña y realmente no me interesaba el rendimiento de concurrencia) en el código de inicio de sesión.

Debería almacenar, por IP, un recuento de fallas y una marca de tiempo.

  • Cada vez que realice un intento de inicio de sesión, entrene si se le permite usar el recuento de fallas y la marca de tiempo.
  • Cada vez que realiza un intento de inicio de sesión permitido y falla, incremente el conteo fallido en 1 y registre el tiempo de falla.
  • Cada vez que realiza un intento de inicio de sesión permitido y logra borrar la información para esa IP.

Uno que no se ha mencionado es hacerles responder preguntas olvidadas sobre la contraseña después de tantos intentos malos + ingresar su contraseña


Mantenga un número de intento de inicio de sesión incorrecto y, si llega a N, bloquee al usuario y solicite que se reinicie el captcha o la contraseña para continuar.