¿Cómo crear un sistema de inicio de sesión seguro con cookies? [cerrado]

2

Para mi educación personal, estoy tratando de crear un sistema de inicio de sesión seguro utilizando cookies. He leído muchos artículos y preguntas de desbordamiento de pila sobre cómo lograrlo, pero no pude encontrar nada útil. Todo el mundo sugiere diferentes formas de lograrlo, pero por alguna razón, los que parecen razonables y saben lo que están haciendo, no lo entiendo.

¿Me puede explicar cuál es la mejor manera de crear un sistema de inicio de sesión seguro con cookies?

He escuchado que el mejor enfoque es tokens. Pero algunas personas dicen que debería agregar un token junto al ID de usuario en la tabla de token en la base de datos, ¿y qué ocurre si una persona inicia sesión desde diferentes dispositivos? Algunos dicen que debería hacer un seguimiento de las direcciones IP para eso, y entonces, ¿qué sucede si una persona inicia sesión desde otra IP? Algunos dicen que debes crear una sesión y una cookie, pero ¿cuál es el punto de la sesión (si la cookie autentica a una persona) ...

He visto muchas preguntas cuando las personas hicieron preguntas similares, y en las respuestas, las personas intentaron explicar cuál es la diferencia entre las cookies y las sesiones. Conozco todas las diferencias y toda la teoría. Simplemente no puedo entender la técnica para hacer todo seguro.

No puedo entender claramente cómo debería funcionar lógicamente ese sistema, así que, ¿puede explicarme ese paso a paso?

    
pregunta Tack 09.12.2015 - 05:45
fuente

2 respuestas

3

En PHP, crear una sesión es fácil. Primero lo declara usando session_start() . Se encarga de crear una cookie de sesión para usted, y casi todas las cosas difíciles. Cuando el usuario navega a través de su sitio, puede leer y escribir en las variables de sesión utilizando el objeto global $_SESSION , que puede afectar el contenido que desea mostrarle al usuario e incluso cómo se muestra.

Lo que sucede, es que el servidor genera un token aleatorio seguro en su lado y luego envía el valor como una cookie al cliente que el cliente se comunica automáticamente con el servidor en cada solicitud. El servidor toma este valor y lo usa para determinar qué objeto en la memoria debe hacer referencia como el objeto $_SESSION .

Sin embargo, usted quiere manejar el inicio de sesión inicial, usted no va a entrar en eso aquí. Pero una vez que el usuario inicia sesión, desea indicar eso en el $_SESSION global. Para hacerlo seguro, querrá destruir cualquier sesión existente y crear una nueva en la autenticación. La forma en que normalmente lo hago es establecer $_SESSION['user'] al iniciar sesión (después de destruir la sesión anterior y crear una nueva). De esa manera tiene otro uso, verificando si un usuario ha iniciado sesión: if(isset($_SESSION['user'])) .

Esta es una funcionalidad básica, pero esperamos que apunte en la dirección correcta. Las bases de datos no son necesarias para las sesiones, a menos que esté intentando implementar políticas de inicio de sesión / sesión o esté ejecutando su sitio web en un clúster. Eso sería debido a una discusión más complicada que no creo que sea apropiada para entrar aquí.

Editar / Actualizar :

Resulta que, de hecho, entraré en los detalles de un sistema de inicio de sesión seguro; Si desea que su sistema de inicio de sesión esté a la altura de los estándares de seguridad, deberá hash (y sal) su contraseña correctamente. Resulta que hay un método PHP para eso también .

Básicamente, el hash convierte lo que sea la entrada en basura que no se puede devolver a la entrada original. El hash de contraseñas se utiliza para evitar que las personas obtengan acceso a la contraseña original en el caso de un compromiso del servidor / base de datos en el que las contraseñas puedan filtrarse. Lo más importante que se debe saber cuando el hash es que los algoritmos más lentos funcionan mejor para las contraseñas.

La salazón es casi tan importante como el algoritmo utilizado para proteger las contraseñas. El salt es un CSPRNG que simplemente se agrega a la contraseña antes del hashing. CSPRNG significa Cryptographically Secure Pseudo Random Number Generator, y es realmente una forma elegante de decir que es un conjunto de bytes súper aleatorio e impredecible. Estos bytes se generan aleatoriamente por contraseña para proteger a los usuarios finales contra ataques de arco iris, en los que se puede verificar un solo hash producido contra grandes cantidades de contraseñas. Al requerir un solo hash por intento por contraseña, reduce en gran medida las posibilidades de una fuga masiva de contraseñas como resultado de una fuga masiva de hash.

Un sistema manual funcionaría como sigue:

Cuando se crea la cuenta de usuario, se inserta una fila en los "usuarios" de la base de datos con el nombre de usuario especificado y la contraseña con hash. La contraseña con hash primero se graba con sal (datos aleatorios agregados a la contraseña), luego se utiliza con un algoritmo de hashing de contraseña lento. La sal se agrega adicionalmente al hash de contraseña antes de insertarse en la base de datos. Opcionalmente, puede almacenar algo para identificar el algoritmo de hash utilizado con él también. Si se siente incómodo al combinar estos valores, también puede almacenarlos como valores de base de datos separados.

Cuando se inicia el proceso de inicio de sesión, la base de datos se consulta en la tabla de 'usuarios' para la fila con la clave 'nombre de usuario' que coincide con el nombre de usuario solicitado. Se tira esa fila que incluye el hash de contraseña. Primero, la sal se quita del hachís. Luego, se agrega la sal a la contraseña que se proporcionó durante la autenticación y todo se procesó utilizando el mismo algoritmo de hash utilizado originalmente. Luego, si el resultado final coincide con el hash almacenado, el usuario puede autenticarse correctamente.

Espero no estar confundiéndote demasiado con mis explicaciones. Ashley Madison aparentemente perdió el memo por completo, así que si no lo entiendes, no te sientas mal. No eres un sitio web multimillonario. La mayoría de los problemas provienen de cuando las personas se encargan de lograr cosas más allá de su conjunto de habilidades. En ese sentido, le recomiendo que utilice las funciones de hashing de contraseñas incorporadas, o al menos de código abierto y públicamente recomendadas siempre que sea posible. Eliminan todas las conjeturas de la ecuación.

    
respondido por el Jonathan Gray 09.12.2015 - 09:41
fuente
-8

Lo que hago es md5 hash la contraseña, luego se la salta para proteger contra las tablas de Rainbow y almacena dos cookies en la computadora del usuario. Uno con el userid y otro con la contraseña salada. Para protegerme contra la fuerza bruta, registro los intentos fallidos de inicio de sesión, por lo que si alguien cambia la cookie de contraseña a algo incorrecto, se registra. 100 intentos incorrectos significa que la persona no puede volver a iniciar sesión en esa cuenta durante 24 horas.

Hago la sal diferente para cada usuario, por lo que la contraseña x dará un resultado diferente en la fila 1 que en la fila 2. Si alguien revisa las cookies, no podrá averiguar su nombre de usuario. correo electrónico o contraseña.

Al realizar una investigación adecuada, descubrí que esta es una forma segura de ejecutar un sistema de autenticación. Otros sitios web lo hacen más complicado al hacer que la cookie sea una cadena aleatoria, pero esa cadena debe compararse con la base de datos, incluso si esa cadena aleatoria no se encuentra en ninguna parte de la base de datos, por lo que se utiliza un algoritmo para convertir la base de datos del usuario registrado. fila en una cadena aleatoria para autenticarlos.

    
respondido por el desbest 09.12.2015 - 14:55
fuente

Lea otras preguntas en las etiquetas