Pregunta

Pregunté aquí sobre un protocolo que se me pidió que implementara, y lo seguro que era. Como parecía claro desde el principio que era una mierda. Siendo así, pregunto:

¿Pueden señalarme un protocolo de inicio de sesión muy simple (soy nulo en los sistemas de criptografía)? Estoy desarrollando el lado del servidor y el cliente de la aplicación y tengo mi propio sistema de mensajería, así que tengo suficiente libertad.

Solo 2 características especiales para sus sugerencias.

  1. Simple: la red por la que se ejecutará esta aplicación no es especialmente insegura y solo quiero evitar el envío de la contraseña en texto plano

  2. Si es posible, no un intercambio de mensajes demasiado largo. Cuanto más corto, mejor.

¿Fue útil?

Solución

Consulte Autenticación de respuesta de desafío

  • El servidor incluye una cadena de desafío aleatorio en el formulario de inicio de sesión
  • Cuando inicias sesión, javascript codifica la contraseña y luego la codifica con el desafío
  • El servidor luego realiza la misma verificación (su base de datos debe almacenar contraseñas hash, pero este método le impide usar efectivamente un salt para ese hash ya que tendría que transmitirlo)

Otros consejos

El protocolo de tres pasos sería útil. Básicamente, se reduce a:

  • La persona A cifra su contraseña y se la envía a la Persona B.
  • La persona B cifra la contraseña cifrada y la devuelve a la Persona A.
  • La persona A lo descifra y lo devuelve.
  • La persona B lo descifra y obtiene la contraseña en texto sin formato.

De esta manera, la contraseña nunca se envía en texto plano, ni tampoco las claves de cifrado. También es un protocolo relativamente rápido, ya que depende (presumiblemente) del cifrado simétrico, que es muy rápido.

El almacenamiento del hash de contraseña en la base de datos no es seguro de manera óptima en caso de que el contenido de la base de datos llegue a manos no autorizadas. No hay forma de revertir el hash directamente, pero hay dictinonarios en línea (como aquí ) para invertir palabras hash (pass).

En la base de datos debe almacenar algo como:

md5(login_name +  domain_or_appname_salt + password);

La sal en el medio evita muchas formas de ataques de diccionario.

En el lado de los clientes (en el navegador) tendría un formulario de inicio de sesión con nombre de usuario y contraseña. Un pequeño trozo de JavaScript generaría el hash userame + app_salt_ y la contraseña, por lo que solo el nombre de inicio de sesión y el hash generado se enviarán al servidor.

Ahora, la contraseña de texto sin formato nunca se enviará al servidor en texto sin formato. Por lo tanto, no debería tener que confiar en HTTPS aquí.

La misma técnica se puede utilizar en el formulario de actualización de contraseña. Por lo tanto, el servidor nunca conoce la contraseña de texto sin formato.

Espero que te hayas inspirado de esta y las otras respuestas.

¡Feliz piratería!

Huibert

Si su protocolo se ejecuta en TCP, puede escribir la autenticación en claro y luego envolver la comunicación con SSL. Por ejemplo, si está utilizando el puerto 1234 para su protocolo, puede cerrar ese puerto en el servidor y dejar que los clientes lo tunelen con SSH. Esto se puede hacer mediante programación y es una solución muy muy común.

Si su protocolo se ejecuta a través de HTTP, puede hacerlo de forma estándar utilizando HTTPS. Por ejemplo, la autenticación básica a través de HTTPS es lo suficientemente segura para las necesidades que especificó.

Por otro lado, si nunca desea enviar la contraseña por cable, debe realizar una autenticación de respuesta de desafío.

  1. El servidor envía una cadena aleatoria
  2. El cliente envía hash de cadena aleatoria + contraseña
  3. El servidor verifica el hash.

Esto tiene el inconveniente de que la contraseña estará disponible (cifrada en texto sin formato) en el servidor. Si no desea almacenar contraseñas en el servidor, debe volver a mi primer ejemplo.

SASL es un mecanismo de autenticación seguro. El soporte para SASL se proporciona en las bibliotecas estándar de Java para las versiones 1.5+.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top