He leído muchas, muchas, muchas publicaciones sobre cómo "probablemente estás almacenando contraseñas mal". Siempre se refieren al almacenamiento de contraseñas en un servidor en el que un usuario inicia sesión; básicamente repiten (juegos de palabras) consejos omnipresentes como asegurarse de saltear 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 tenga que iniciar sesión manualmente cada vez que desean iniciar sesión; la función "recordarme".
Muchas piezas de software tienen esta característica, desde navegadores hasta programas como Dropbox.
Hace poco leí un artículo antiguo sobre cómo Dropbox estaba almacenando una ID en su computadora que podía copiar / pegar en otra computadora e iniciar Dropbox e iniciar sesión como el dispositivo del que obtuvo la ID; sin inicio de sesión, 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 encriptas, ¿dónde guardas la clave para descifrarlo?
La única forma en que veo que no se introducen 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 se ven obligados a esperar que no tengan que hacerlo.
¿Qué puedo leer sobre el 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 características que no están presentes en todas las plataformas (como el "llavero" que tienen algunas distribuciones de Linux).
Respuestas:
Una forma es:
Según el marco que esté utilizando para desarrollar su sitio, este comportamiento puede estar disponible como una característica incorporada.
Tenga en cuenta que, dado que el protocolo HTTP no tiene estado de todos modos, en realidad no existe una diferencia funcional entre mantener a alguien conectado durante una sola sesión de uso del sitio web e "inicio de sesión automático" la próxima vez que use el sitio; es solo una cuestión de cuánto tiempo permite antes de que expire 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.
fuente
Amazon (y muchos otros) usan un enfoque híbrido. Proporcionan inicio de sesión automático para navegar, agregar artículos al carrito y realizar pedidos utilizando combinaciones de direcciones de envío / crédito que ha utilizado 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 aún así obtienen lo que ordenan! (Más importante aún, el incentivo para secuestrar una sesión es bastante negado). Pero si alguien tiene acceso a mi computadora, tengo mayores problemas 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 una ID de sesión (hash o lo que sea que desee) para iniciar sesión automáticamente en los usuarios de las partes de baja seguridad del sitio , pero pídales 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, entonces el inicio de sesión automático no es una opción. Nuevamente, los sitios que usan este tipo de seguridad asumen el valor de los datos que están protegiendo y la conveniencia adicional para el usuario sopesar el riesgo potencial de una sesión secuestrada. Si cree que ese no es el caso de su aplicación, no implemente los inicios de sesión automáticos. Debe acceder a qué nivel de seguridad / usabilidad son apropiados para su caso de uso.
fuente
En realidad no es tan difícil. Primero almacene una cookie con este formato:
Puede usar un hash sha1 para el token. Luego, en su ID de usuario de la tienda de la base de datos remember_me_tokens, 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 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 coincidente de cookie / base de datos y genere una nueva fila de cookie / token / base de datos.
Si cierran sesión, elimine la cookie.
Ejecute un trabajo cron para podar remember_me_tokens que tengan más de 7 días.
fuente
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:
fuente