¿Debería el cliente o el servidor generar el par de claves público-privadas del cliente?

2

Digamos que tengo una aplicación de mensajería móvil. Hay un servidor central que administra las cosas (como un directorio de usuarios, incorporación, etc.) y hay todos los clientes.

Mi aplicación es profesional, por lo que utiliza un cifrado asimétrico para enviar mensajes de forma segura.

Mi pregunta es, en resumen, ¿el cliente o el servidor deben generar el par de claves público-privadas?

Si el cliente genera el par, entonces el par puede generarse en el lado del cliente y luego enviarse al servidor (tal vez encriptado con la clave pública del servidor).

Si el servidor genera el par, entonces tuve una idea más complicada:

  1. El cliente genera un secreto ( S )
  2. El cliente cifra el secreto con la clave pública del servidor
  3. El cliente envía el secreto cifrado al servidor
  4. El servidor descifra el secreto cifrado con la clave privada del servidor
  5. El servidor genera un par de claves público-privadas para el cliente
  6. El servidor cifra la clave privada con un secreto ( S ) y la elimina de la memoria
  7. El servidor envía una clave privada encriptada al servidor
  8. El cliente descifra la clave privada cifrada con un secreto ( S ), que tenía desde el principio
  9. ¡Hurra! El cliente ahora tiene clave privada y la clave pública está en el servidor! :)

Entonces, ¿cuál es el mejor enfoque? ¿Debería el cliente o el servidor generar el par de claves público-privadas desde una perspectiva de seguridad? ¿Existe una forma mejor / más eficiente / más segura de hacerlo que mis soluciones?

    
pregunta Daniel 24.07.2018 - 20:35
fuente

2 respuestas

5
  

Mi pregunta es, en resumen, si el cliente o el servidor generan el   par de claves público-privadas?

En theory , el cliente debe generar su propio par de claves. De esa manera la clave privada:

  • es conocido solo por el cliente
  • no está expuesto a la transferencia

En práctica , no es extraño ver que los servidores generan claves de clientes y las distribuyen. Sin embargo, esto generalmente solo se hace en los casos en que el cliente carece de algún recurso necesario que pueda generar una clave y un CSR en sí mismos:

  • procesador limitado
  • se requiere interacción humana

(Literalmente, la mayoría de las configuraciones de "el servidor reparte las llaves" que he visto se reducen a "nuestros usuarios son demasiado estúpidos, y nuestro grupo de soporte no quiere tenerlos a mano")

Parece que estás implementando servidores y clientes. Si tiene ese nivel de control, genere claves de cliente en el cliente porque es lo correcto.

    
respondido por el gowenfawr 24.07.2018 - 20:46
fuente
2
  

¿el cliente o el servidor deben generar el par de claves público-privadas?

Creo que eso depende de cuál sea tu objetivo de diseño:

Si desea que la comunicación sea totalmente segura y que solo pueda ser descifrada por el remitente y el receptor, las claves deben generarse en el cliente, y nunca abandonarlo. Si el cliente es una aplicación de Android o iOS, busque en el Almacén de claves de Android o Enclave seguro de Apple para que las claves del cliente se creen en un procesador independiente y no sean accesibles para la aplicación, y mucho menos para el servidor.

Si desea que el servidor pueda leer / archivar / registrar / modificar / wtv los mensajes, entonces el servidor necesita una copia de todas las claves privadas (o un protocolo donde cada cliente se cifra para el par de llaves del servidor). En ese momento, sin embargo, renuncias a todas las pretensiones de privacidad.

El método que ha descrito donde una parte genera la clave y la envía a la otra es un esquema bien utilizado. De hecho, así es exactamente como funciona el modo de establecimiento de clave RSA de TLS donde el cliente envía un secreto premaster al servidor del cual se deriva la clave de sesión (diapositiva tomada de una charla en la escuela de verano de la Universidad Royal Holloway de Londres ).

    
respondido por el Mike Ounsworth 24.07.2018 - 20:39
fuente

Lea otras preguntas en las etiquetas