Cómo implementar de forma segura el inicio de sesión automático

15

He leído muchas, muchas, muchas publicaciones sobre cómo "probablemente estás almacenando contraseñas incorrectamente". Siempre se refieren al almacenamiento de contraseñas en un servidor en el que un usuario está iniciando sesión; básicamente repasan (pretenden) consejos omnipresentes como asegurarse de eliminar las contraseñas, etc. Sin embargo, nunca he visto un artículo sobre las mejores prácticas para almacenar contraseñas en un cliente para que el cliente no tiene que iniciar sesión manualmente cada vez que quieran iniciar sesión; La función "Recuérdame".

Muchas piezas de software tienen esta característica, desde navegadores hasta programas como Dropbox.

Leí un artículo antiguo recientemente, acerca de cómo Dropbox almacenaba una identificación en su computadora que podría copiar / pegar en otra computadora e iniciar Dropbox e iniciar sesión como el dispositivo del cual obtuvo la identificación; sin inicio de sesión, sin nada, y acceso completo a la cuenta de Dropbox. Esto parece un diseño realmente estúpido, pero no puedo pensar en una mejor manera de hacerlo.

Ni siquiera estoy seguro de cómo evitar almacenar algo como una cookie en texto sin formato. Si lo cifra, ¿dónde almacena la clave para descifrarlo?

La única forma que veo para no introducir vulnerabilidades de seguridad es eliminar la función de inicio de sesión automático y hacer que el usuario escriba su contraseña cada vez que quiera usar un servicio, pero eso es una lucha de usabilidad y los usuarios están malcriados esperando que no tengan que hacerlo. haz eso.

¿Qué puedo leer acerca del almacenamiento local de credenciales de forma segura para implementar la función de inicio de sesión automático? Si los principios son demasiado simples para un artículo completo, ¿cuáles son? El software en cuestión no debe depender de las características que no están presentes en todas las plataformas (como el "llavero" que tienen algunas distribuciones de Linux).

    
pregunta Jay Simon 05.06.2013 - 10:36
fuente

4 respuestas

12

Una forma es:

  • Cuando el usuario inicie sesión, almacene un ID de sesión en una cookie en la computadora del cliente (no el nombre de usuario o la contraseña).
  • Vincule la sesión a la dirección IP, de modo que una ID de sesión individual solo funciona con la computadora en la que se inició.

Según el marco que esté utilizando para desarrollar su sitio, este comportamiento puede estar disponible como una característica integrada.

Tenga en cuenta que, dado que el protocolo HTTP no tiene estado de todos modos, en realidad no hay una diferencia funcional entre mantener a alguien conectado durante una sola sesión de usar el sitio web y "iniciar sesión automáticamente" la próxima vez que lo utilicen; es únicamente una cuestión de cuánto tiempo permite antes de que caduque la sesión.

Actualización: También, use HTTPS para mayor seguridad, obviamente.

Actualización 2: tenga en cuenta que este enfoque tiene limitaciones, ya que no funciona bien para los usuarios que cambian mucho su dirección IP. Sin embargo, proporciona un mayor nivel de seguridad y puede ser útil en algunas situaciones.

    
respondido por el user82096 05.06.2013 - 11:12
fuente
5

Amazon (y muchos otros) utilizan un enfoque híbrido. Proporcionan el inicio de sesión automático para navegar, agregar artículos al carro y realizar pedidos utilizando las combinaciones de direcciones de envío / crédito que usted ha usado anteriormente. Sin embargo, requieren que ingrese su contraseña para muchas acciones, como agregar tarjetas de crédito, agregar / cambiar direcciones de envío, actualizar contraseñas, ver pedidos anteriores (opcionalmente para el usuario) y muchas otras configuraciones de cuenta.

Entonces, sí, las personas que obtienen acceso a su computadora podrían secuestrar su sesión, ¡pero usted sigue recibiendo lo que ordenan! (Lo que es más importante, el incentivo para secuestrar una sesión está prácticamente negado). Pero si alguien tiene acceso a mi computadora, tengo problemas más grandes que las personas que roban las sesiones promedio del sitio.

Si tiene partes de su aplicación que no necesitan tanta seguridad, puede elegir un modelo híbrido donde almacene un ID de sesión (con hash o lo que sea si desea) para iniciar sesión automáticamente en las partes de baja seguridad. del sitio, pero requieren que ingresen la contraseña cuando ingresen a áreas de mayor seguridad y eliminen el token de alta seguridad cuando finalice la sesión.

Por supuesto, si este es un sitio de nivel bancario, el inicio de sesión automático no es una opción. Nuevamente, los sitios que utilizan estos tipos de seguridad asumen que el valor de los datos que están protegiendo y la conveniencia adicional para el usuario pesan el riesgo potencial de una sesión secuestrada. Si cree que ese no es el caso de su aplicación, entonces no implemente inicios de sesión automáticos. Debe acceder a qué nivel de compensación de seguridad / usabilidad es apropiado para su caso de uso.

    
respondido por el Eric G 21.06.2013 - 18:50
fuente
2

En realidad no es tan difícil. Primero almacena una cookie con este formato:

userID.token

Puedes usar un hash sha1 para el token. Luego, en su tabla de base de datos remember_me_tokens ID de usuario de almacén, un hash bcrypt del token y la hora en que se generó el token.

Luego, cuando alguien visite su sitio, verifique si la cookie está configurada. Si la cookie está configurada, vea si hay una fila válida para ella en la base de datos en los últimos 7 días, por ejemplo. Si hay una fila válida en la base de datos para la cookie, configure la sesión para indicar que el usuario ha iniciado sesión y también elimine la fila de cookie / base de datos coincidente y genere una nueva fila de cookie / token / base de datos.

Si se desconectan, borre la cookie.

Ejecute un trabajo cron para eliminar record_me_tokens que tienen más de 7 días.

    
respondido por el Ryan 05.06.2013 - 11:04
fuente
0

Solo puede hacerlo si confía en el dispositivo donde lo almacena. Depende del usuario (si no puede influir en el dispositivo) qué tan seguro es. Simplemente está fuera de tus manos.

Como se indica en los comentarios:

  

Se trata de lo que confías. Si no confías en la máquina, guarda el ID, entonces ese es tu problema. Si confías en el llavero, entonces esa es la máxima seguridad que obtendrás. Por supuesto, puedes agregar seguridad personalizada, como detectar el hardware del dispositivo o algo así, pero todo es falso, por lo que no puedes saberlo al final. Está fuera de su control.

    
respondido por el Luc Franken 05.06.2013 - 11:21
fuente

Lea otras preguntas en las etiquetas