Contraseña de texto sin formato a través de HTTPS

93

Actualmente estoy trabajando en un proveedor PHP OpenID que funcionará sobre HTTPS (por lo tanto, cifrado con SSL).
¿Es incorrecto que transmita la contraseña como texto sin formato? HTTPS en teoría, no se puede interceptar, así que no veo nada malo. ¿O es esto inseguro en algún nivel y no veo esto?

WhyNotHugo
fuente

Respuestas:

129

Es seguro. Así es como funciona toda la web. Todas las contraseñas en los formularios siempre se envían en texto sin formato, por lo que depende de HTTPS protegerlas.

Eduardo Scoz
fuente
20
Minorito: algunos formularios de inicio de sesión usan JavaScript para codificar la contraseña en lugar de enviarla como texto sin formato.
Thorarin
5
@Thorarin si realmente lo hash, eso significa que el servidor está almacenando la contraseña en texto sin formato para que pueda hacer hash con la misma sal para verificar. ¡Ick! Es mejor enviar la contraseña en texto envuelto ssl, ya que el servidor no necesita almacenar la contraseña en texto sin formato.
DGM
11
@DGM: el doble hash también es una opción, por lo que las contraseñas de texto sin formato no son estrictamente necesarias.
Thorarin
3
@Denis: el hash del lado del cliente no ayuda mucho. Puede hacer las cosas un poco más difíciles que el texto sin formato, pero alguien que realmente quiera robar una contraseña puede hacerlo sin problemas. Solo funcionaría de manera segura si envía al menos un token por única vez a través de un canal seguro (ssl), en cuyo caso también podría enviar la contraseña en SSL para comenzar.
Eduardo Scoz
4
Solo estoy diciendo que Yahoo sintió que el hash del lado del cliente era lo suficientemente seguro hasta que pudieron permitirse el lujo de moverse hasta SSL. Pero bueno, estoy a favor de https :)
Denis
74

Aún debe asegurarse de enviarlo mediante solicitud POST, no GET. Si lo envía a través de una solicitud GET, se puede guardar en texto plano en los registros del historial del navegador del usuario o en los registros de acceso del servidor web.

nadie
fuente
7
Sí, lo sabía, pero sigue siendo un buen comentario para dejar a otros que vienen a buscar aquí. :)
WhyNotHugo
o enviarlo en un encabezado
james
22

Si HTTP está deshabilitado y solo usa HTTPS, entonces realmente no está transmitiendo la contraseña como texto sin formato de todos modos.

Can Berk Güder
fuente
4
Sin embargo, el servidor tiene acceso a su contraseña en texto plano, que pueden almacenar como texto plano, conectarse de forma incorrecta como texto sin formato, etc. Es decir, la contraseña no se queda en el lado del cliente, el servidor también se ve exactamente lo que es.
xref
14

Hash del lado del cliente. ¿Por qué? Déjame contarte un pequeño experimento. Camine hasta la computadora en la cafetería de la empresa. Abra el navegador en la página de inicio de sesión del sitio web de la empresa (https). Presione F12, haga clic en la pestaña de red, marque el registro persistente, minimice la consola pero deje la página web abierta para iniciar sesión. Siéntese y almuerce. Observe cómo empleado tras empleado inicia sesión en el sitio web de la empresa y cómo un buen trabajador se desconecta cuando termina. Termine el almuerzo, siéntese en la computadora, abra la pestaña de red y vea cada nombre de usuario y contraseña en texto sin formato en el formulario bodys.

Sin herramientas especiales, sin conocimientos especiales, sin hardware de piratería sofisticado, sin keyloggers, solo el viejo F12.

Pero bueno, sigue pensando que todo lo que necesitas es SSL. Los malos te amarán por eso.

CodeDog
fuente
6
Tu comentario de la cafetería no tiene ningún sentido, no importa cuánto lo vuelva a leer. ¿Por qué la gente simplemente se acerca a una computadora y escribe sus credenciales? ¿Qué intentas probar? Además, el hash no hará que esto sea más inseguro, de ninguna manera. Era común usar hash en las contraseñas y transmitirlas a través de HTTP de texto plano cuando se escribió esta pregunta, en 2009.
WhyNotHugo
4
Elegí ambos porque sí, la respuesta aceptada se lee muchos años después. Sería bueno si @CodeDog señalara alguna estrategia de mitigación. Y sí, la gente simplemente se acercará a PC al azar, por ejemplo, en la biblioteca local, ¡e ingresará sus datos!
JoeAC
3
Encripto las contraseñas del lado del cliente con una clave pública, luego publico solo la contraseña encriptada en el formulario. Es una clave asimétrica, por lo que tener la clave pública del lado del cliente es inútil para los atacantes. Cada registro genera un nuevo par de claves, por lo que los ataques de reproducción tampoco funcionarán. La clave incluso cambia en intentos fallidos de inicio de sesión. Los pares de claves se generan en el lado del servidor cuando los usuarios llegan a la pantalla de inicio de sesión. Solo se proporciona la clave pública al código del lado del cliente.
CodeDog
Por cierto, he visto que el personal utiliza este truco en el centro de negocios de un hotel para recopilar códigos de acceso para los números de habitación. Usarían el código de acceso para conectarse a la red inalámbrica y usar las computadoras del centro de negocios y se facturaría a la habitación.
CodeDog
Realicé un experimento de este tipo al iniciar sesión en mi cuenta bancaria y debo estar de acuerdo con @CodeDog: la carga útil de la solicitud incluye mi nombre de usuario y contraseña, ambos en texto plano.
Artur Michajluk
6

Tomemos algunas notas a las respuestas anteriores.

Primero, probablemente no sea la mejor idea usar algoritmos hash del lado del cliente. Si su contraseña está salada en el lado del servidor, no podrá comparar hashes (al menos no si no almacena el hash del cliente en la base de datos en una de las capas de hash de la contraseña, que es la misma o peor). Y no desea implementar el algoritmo hash utilizado por la base de datos en el lado del cliente, sería una tontería.

En segundo lugar, el intercambio de claves criptográficas tampoco es ideal. El MITM podría teóricamente (considerando que tiene un certificado raíz instalado en el cliente) cambiar las claves criptográficas y cambiar con sus propias claves:

Conexión original (sin considerar tls) de un servidor teórico que intercambia claves:

El cliente solicita claves públicas> el servidor contiene las claves privadas, genera claves públicas para el cliente> el servidor envía claves públicas al cliente

Ahora, en una pista teórica MITM:

El cliente solicita claves públicas> MITM genera claves privadas falsas > El servidor contiene las claves privadas, genera claves públicas para el cliente> MITM recibe las claves públicas del servidor original, ahora, podemos enviar nuestras claves públicas falsas al cliente y Siempre que una solicitud provenga del cliente, descifraremos los datos del cliente con las claves falsas, cambiaremos la carga útil (o la leeremos) y encriptaremos con las claves públicas originales > MITM envía claves públicas falsas al cliente.

Ese es el punto de tener un certificado CA confiable en TLS, y así es como recibe un mensaje del navegador que advierte si el certificado no es válido.

En respuesta al OP: en mi humilde opinión no puedes hacer eso, porque tarde o temprano alguien querrá atacar a un usuario de tu servicio e intentará romper tu protocolo.

Sin embargo, lo que puede hacer es implementar 2FA para evitar que las personas intenten iniciar sesión con la misma contraseña. Sin embargo, tenga cuidado con los ataques de repetición.

No soy bueno con la criptografía, corrígeme si me equivoco.

Lucca Ferri
fuente
Tenga en cuenta que esta discusión es de 2009. Estas eran prácticamente las mejores prácticas en ese momento.
WhyNotHugo
3
@WhyNotHugo, lo sé. Decidí dejar una respuesta porque la mejor respuesta de Google a esta pregunta me llevó aquí, así que ¿por qué no?
Lucca Ferri
4

Los otros carteles son correctos. Ahora que está utilizando SSL para cifrar la transmisión de la contraseña, asegúrese de aplicar un algoritmo hash con un buen algoritmo y sal para que también esté protegida cuando esté en reposo ...

Grossvogel
fuente
Sí, me doy cuenta de esto, gracias, me refería simplemente a la transmisión aquí.
WhyNotHugo
0

El ejemplo de @CodeDog tiene problemas ...

Sí, puedo creer que los usuarios iniciarán sesión en una caja de cafeteria. Si está capturando registros de una cafetería corporativa, entonces usted es la brecha de seguridad. Las cajas de cafeterías corporativas deben configurarse deshabilitadas, por ejemplo, sin términos, sin registradores, sin acceso remoto, etc. Para evitarlo, el hacker interno.

El ejemplo es bueno para la seguridad del acceso a la computadora y no está realmente relacionado con la seguridad de la red. Se proporciona como justificación para el hash del lado del cliente, pero si tiene acceso a una computadora, puede usar un registrador de pulsaciones de teclas y omitirlo. El hash del lado del cliente es nuevamente irrelevante. El ejemplo de @CodeDog es un truco de acceso a la computadora y requiere técnicas diferentes a las de la capa de red.

Además, un pirateo informático público está protegido paralizando el sistema de las amenazas, como se mencionó anteriormente. por ejemplo, use un Chromebook para una computadora de cafetería pública. Pero eso se pasa por alto mediante un truco físico . Durante las horas libres, vaya a la cafetería y configure una cámara secreta para grabar las pulsaciones de teclado de los usuarios. Entonces no importa si la computadora de la cafetería está dañada, O qué tipo de cifrado se utiliza.

capa física -> capa de computadora -> capa de cliente -> capa de red -> capa de servidor

Para redes, no importa si aplica hash en el lado del cliente porque la capa https / ssl cifrará la contraseña simple. Como otros mencionan, el hash del cliente es redundante si el TLS es seguro.

ramakarl
fuente
1
Si bien hace buenos puntos, está respondiendo a una respuesta (que en sí misma no es realmente relevante para la pregunta formulada), por lo que no es realmente apropiado para el modelo de preguntas y respuestas de Stackoverflow.
Martin