¿Es seguro enviar nombres de usuario / contraseñas claros en una conexión https para autenticar a los usuarios?

94

Estoy configurando un servidor HTTP doméstico que puede enviar y recibir datos JSON a / desde diferentes clientes (aplicaciones de Android y iPhone).

Me gustaría permitir el acceso solo a ciertos usuarios y estoy considerando usar un mecanismo simple de nombre de usuario / contraseña, ya que la configuración de certificados de clientes parece un poco excesivo para este pequeño proyecto.

Por supuesto, no puedo enviar contraseñas claras desde el cliente al servidor en HTTP simple, de lo contrario, cualquier persona con wireshark / tcpdump instalado podría leerlo. Entonces, estoy pensando en el siguiente mecanismo:

  1. El servidor HTTP se puede configurar como servidor HTTPS
  2. El servidor también tiene una base de datos de nombre de usuario / contraseña (las contraseñas se pueden guardar con bcrypt)
  3. El cliente abre la conexión HTTPS, autentica el servidor (por lo que se necesita un certificado de servidor) y después de intercambiar la clave maestra, la conexión debe estar cifrada.
  4. El cliente envía el nombre de usuario / contraseña en claro al servidor
  5. El servidor ejecuta bcrypt en la contraseña y la compara con la almacenada en la base de datos

¿Hay algún problema con este tipo de configuración? La contraseña debe ser segura ya que se envía en una conexión cifrada.

    
pregunta Emiliano 04.08.2014 - 15:56
fuente

8 respuestas

65

Sí, esta es la práctica estándar. Hacer algo que no sea esto ofrece una ventaja adicional mínima, si la hay (y en algunos casos puede dañar la seguridad). Siempre que verifique una conexión SSL válida con el servidor correcto, entonces la contraseña está protegida por cable y solo puede ser leída por el servidor. No ganas nada disfrazando la contraseña antes de enviarla, ya que el servidor no puede confiar en el cliente.

La única forma en que la información podría perderse de todos modos es si la conexión SSL se vio comprometida y si la conexión SSL se vio comprometida de alguna manera, el token "disfrazado" sería todo lo que se necesita para acceder a la cuenta, por lo que no Bueno para proteger la contraseña aún más. (Podría decirse que proporciona una protección leve si han usado la misma contraseña en varias cuentas, pero si están haciendo eso, para empezar, no son particularmente conscientes de la seguridad).

Como señaló MyFreeWeb, también hay algunos sistemas elaborados que pueden usar una respuesta de desafío para garantizar que el cliente tenga la contraseña, pero estos son realmente complicados y no se utilizan en absoluto. Tampoco ofrecen una gran ventaja adicional, ya que solo protegen la contraseña para evitar que se comprometa en un servidor hackeado activamente.

    
respondido por el AJ Henderson 04.08.2014 - 18:23
fuente
19

No necesariamente.

También debe asegurarse de lo siguiente:

  1. Su sitio está protegido contra falsificaciones de solicitudes entre sitios. Utilice la sincronización del patrón de token.

  2. Su sitio está protegido contra ataques de fijación de sesión. Cambiar el ID de sesión al iniciar sesión.

  3. Si usa cookies de sesión, todo su sitio es HTTPS, no solo la URL de inicio de sesión, y que su cookie de sesión está marcada como segura y solo http (sin acceso a JavaScript). El navegador enviará una cookie de sesión sin cifrar si el usuario escribe http://yoursecuresite (en la misma sesión del navegador).

  4. Estás utilizando un protocolo reciente. SSL 1 y 2 están rotos, y 3 también podrían estarlo. Intente utilizar TLS 1.1 o 1.2.

  5. Estás usando un cifrado fuerte.

  6. No está utilizando la compresión HTTP (GZip) o la compresión TLS. Si su sitio muestra la entrada del usuario (como una entrada de búsqueda), entonces puedo averiguar sus tokens CSRF y su número de cuenta bancaria si está usando compresión.

  7. Su servidor no permite la renegociación de clientes inseguros.

  8. Está utilizando una clave RSA de 2048 bits (o el equivalente para una clave EC), y nadie más conoce su clave privada.

  9. Estás usando HSTS, por lo que el navegador va directo a https, incluso si el usuario escribe http

  10. Está utilizando un perfecto secreto hacia adelante, por lo que sus comunicaciones históricas son seguras incluso si su clave privada está filtrada

respondido por el Neil McGuigan 04.08.2014 - 19:26
fuente
15

Siempre que verifique la validez del certificado, esto está perfectamente bien y se realiza todo el tiempo.

    
respondido por el mricon 04.08.2014 - 16:07
fuente
7

La mayoría de los sitios que generalmente se consideran seguros toman prácticamente el enfoque que está describiendo. O dicho de otra manera, simplemente ha descrito el estándar establecido de la industria.

Recomendaría no utilizar un enfoque menos seguro que el que usted menciona. (Ya sea que bcrypt sea mejor o peor que otros hash salados es una discusión en la que no voy a entrar. Simplemente no use nada más débil que un hash salado).

Si desea distinguirse por tener seguridad por encima de los estándares industriales establecidos, hay otras opciones disponibles. Pero requiere un gran esfuerzo en todas las áreas de su aplicación para que valga la pena.

Las áreas relacionadas con la validación de contraseñas que podrían ser más seguras incluyen:

  • Protegiendo el servidor contra ataques DoS descargando la mayor parte del cómputo durante la validación al cliente. Es decir. no iterar hashing en el lado del servidor, solo iterar en el lado del cliente y realizar el último paso de hashing en el servidor.
  • Protéjase contra las pérdidas de contraseña si el servidor se ve comprometido al obtener un par de claves públicas de la contraseña y nunca deje que el servidor vea la contraseña o la clave secreta.
respondido por el kasperd 04.08.2014 - 16:15
fuente
4

Como han dicho otros, este es un enfoque estándar.

Sin embargo, para un sitio personal no necesariamente lo seguiría ... Yo usaría el inicio de sesión federado de Facebook, Google o similar, de esa manera no tengo que manejar los problemas del ciclo de vida de la cuenta, y puedo usar Google 2 Factor de autenticación, etc.

Se ahorra tener bastantes formularios y campos en su base de datos, lo que significa menos para salir mal.

Por supuesto, todavía debe autorizar a aquellos usuarios a los que desea acceder mediante una función del proveedor de autenticación, como un grupo de Facebook, algún tipo de lista blanca de usuarios permitidos o un flujo de aprobación de su cuenta. . A veces esto se hace invitando a los usuarios: dándoles una URL que contiene un código de seguridad único y el sistema que lo vincula a un proveedor de Auth en el primer inicio de sesión. Alternativamente los usuarios autetetican y solicitan acceso. Esto los coloca en un estado "pendiente". A continuación, proporciona una interfaz donde puede iniciar sesión y aprobarlos.

    
respondido por el Andy Boura 05.08.2014 - 09:46
fuente
2

HTTPS hace que la solicitud de autenticación no se pueda modificar en tránsito. Sin embargo, para hacerlo "seguro", hay otras cosas que también necesita para hacer las cosas bien. Por ejemplo:

  • La página de inicio de sesión completa y todas sus dependencias también deberían haber sido servidas a través de HTTPS, incluso aunque no se esté transmitiendo una contraseña. Servir cualquier parte de él (como JavaScript, CSS o recursos de imagen) a través de HTTP sin cifrar le permitiría a un atacante modificar la apariencia o el comportamiento de la página de inicio de sesión a través de un ataque de intermediario.

    Los navegadores tratarán el contenido mixto de HTTP / HTTPS con diversos grados de sospecha. Algunos simplemente suprimirán el

respondido por el 200_success 05.08.2014 - 18:33
fuente
0

Wikipedia que tiene la página completa de problemas históricos de seguridad de HTTPS.

Los errores de seguridad de HTTPS han ocurrido antes (¿por qué se rompen las dos versiones anteriores? ¿Y qué es 'goto fail'? ¿Qué es 'https freak'?).

No sugiero deshacerme de HTTPS, pero colocar algo adicional debajo no hará daño en la mayoría de los casos. Si ya puedes enviar una contraseña sin cifrar a través de ese canal, probablemente puedas enviar lo que quieras.

    
respondido por el h22 27.10.2015 - 13:39
fuente
0

El uso de HTTPS no impide los intentos de fuerza bruta de la contraseña. Por lo tanto, si está implementando su propia administración de cuenta de usuario, es posible que desee considerar características como la complejidad mínima de la contraseña y el bloqueo de la cuenta / la cantidad máxima de reintentos que podrían mitigar estos intentos.

    
respondido por el D.H. 28.10.2015 - 14:16
fuente

Lea otras preguntas en las etiquetas