2009-01-19 10 views
11

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.¿Cómo acelerar los intentos de inicio de sesión en Java webapp?

Jeff explained the why, but not the how.

Simon Willison mostraron un implementation in Python for Django: que en realidad no me ayude a lo largo ya que no puedo usar memcached ni Django.

Llevar sus ideas desde cero tampoco parece una gran idea - No quiero reinventar la rueda.

Encontré uno Java implementation, aunque parece bastante ingenuo: en lugar de un LRU caché, simplemente 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 no quiero realmente otra tecnología más 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?

Respuesta

1

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

+0

Sin embargo, cualquier inicio de sesión puede matar la experiencia del usuario. – Loki

+0

Cualquier inicio de sesión fallido es estándar en el mundo de Unix, pero la parte de la aplicación web implica que un atacante podría hacerlo en múltiples subprocesos, por lo que un tiempo de espera simple no es suficiente, debe almacenar el intento de inicio de sesión y crear código para acceder y verificarlo. – Loki

+0

Solo demorar todos los intentos no impide que alguien ejecute 50 solicitudes en paralelo. Es por eso que Simon Willison almacena la dirección IP junto con la marca de tiempo en el caché. –

7

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.

Crear una clase para almacenar la siguiente:

  • El número de intentos (recuento)
  • 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 todo hombre (siempre que el código esté sincronizado).

+0

He pedido una solución en Java, esto obviamente no es Java. Aparte de eso, teniendo en cuenta sus propios comentarios: estoy buscando una solución sólida y bien probada, no algo lanzado en cinco minutos. Un sistema de aceleración que se bloquea después de unas pocas horas o algo no es muy útil. –

+0

Lo que estoy diciendo es que ninguna biblioteca implementa eso directamente. Todo lo que necesita es una forma sincronizada de poner datos (usuario, recuento y tiempo o solo usuario y tiempo) y verificarlo. Muchas bibliotecas ofrecen el almacenamiento sincronizado, depende de usted adaptarlo. Estoy ofreciendo el andamiaje de una solución. – Loki

+0

Un simple mapa o vector sincronizado debería hacerlo. No necesita sistemas como ehCache solo para eso. – Loki

0

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

+1

Suena como una manera fácil de hacer ciertos usuarios. –

+1

Como tendría CUALQUIER forma de retraso exponencial. Lo que es más importante, a medida que pasa el tiempo, el usuario se vuelve cada vez más fácil y sencillo (ya que cada falla intencional adicional funciona el doble que la anterior) – SCdF

0

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

1

Uno que no se ha mencionado es hacer que responde a la pregunta de contraseña olvidada (s) después de tantos intentos incorrectos + introducir su contraseña

0

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

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

Almacenará, por IP, un recuento de fallas y una marca de tiempo.

  • Cada vez que realice un intento de inicio de sesión, entrene en el entrenamiento si están autorizados a usar el contador 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.
0

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

Cuestiones relacionadas