¿Cómo cifrar datos confidenciales del usuario y transportarlos de forma segura entre el cliente y el servidor?

1

Trataré de ser lo más breve posible, soy nuevo en esto, ¡así que no lo dude! ¡Podría estar cometiendo un error masivo y ni siquiera darme cuenta! ¡Por favor ayuda! [Emoji de facepalm]

Requisitos de la aplicación:

  • El frontend debe ser un sitio web
  • El usuario debe proporcionar su propia API TOKEN y SECRET a una API de la tercera parte
  • Mientras haya iniciado sesión en el sitio web, el usuario puede activar manualmente acciones en dicha tercera API a través de la IU de mi aplicación
  • Mientras el usuario está desconectado, mi servicio debe hacer llamadas programadas al servicio de la tercera parte (léase como: un servidor debe poder leer y enviar sus claves a través de POST a un servicio de la tercera parte en texto simple)

Estos son los pasos que estoy tomando para disminuir mi ataque de superficie:

  • Implemente un microservicio que será responsable solo del almacenamiento de claves y de realizar tareas en segundo plano

  • Genere una clave RSA para mi microservicio

  • Oculte el microservicio del usuario solo con la url en el backend (use mi servidor http como proxy)

Cuando el usuario ejecuta manualmente una acción a través de mi interfaz de usuario:

  • Generaré una clave RSA en el lado del cliente usando su contraseña (debe ser fuerte) como frase de contraseña y generar una clave de 1024 bits, enviar la clave pública al servidor HTTP que la enviará al SERVIDOR DE SECRETOS

  • En el servidor secreto, si el usuario nunca se registró, guardaré este ID de usuario y la clave pública asociada

  • Cuando el usuario ingrese sus claves, las cifraré con la CLAVE PUB de mi SECRETS SERVER y las firmaré con la clave privada del usuario

  • Publícalo en mi SERVIDOR HTTP que publicará en mi SERVIDOR DE SECRETOS

  • Mi servidor secreto verifica si el mensaje fue firmado por el pub_key excepto, y si lo está, guarda los datos del usuario cifrados con sus propias claves privadas (servidor) en la base de datos

Cuando se debe ejecutar un trabajo en segundo plano:

  • EL SERVIDOR DE SECRETOS lee la clave de la base de datos, descifra las TECLAS DE API, realiza la POST de HTTP y elimina el texto sin formato de la memoria

¿Qué podría salir mal? (por lo que yo entiendo!)

  • Alguien obtiene acceso a mi servidor HTTP, descubre mi SERVIDOR SECRETO, lo agrieta, lee las credenciales de la base de datos y la clave privada, obtiene las TECLAS DE API y huye.

  • Alguien tiene acceso a mis credenciales, encuentra la computadora del servidor secreto, se las arregla para descargar la base de datos, encontrar la clave privada, obtener las TECLAS API y huir.

Preguntas clave:

  • ¿Qué más podría salir mal?

  • ¿Generar una clave RSA en el lado del cliente usando la contraseña del usuario ya que la frase de contraseña es "suficientemente buena"?

  • ¿La clave RSA generada en el cliente será siempre idéntica, independientemente de la computadora en la que inicie sesión?

  • ¿Esto tiene sentido?

  • En este hilo si lo entendí correctamente, se recomienda "estirar" la frase de contraseña antes de generar la clave, pero como un usuario podría aplicar ingeniería inversa al archivo .js en mi sitio web, también descubriría cómo se estira la clave, ¿no?

¡Gracias por leerlo todo! Realmente aprecio cualquier consejo.

    
pregunta kroe 23.06.2017 - 03:41
fuente

1 respuesta

1

Esto parece una solución demasiado compleja para el problema. Una cosa importante para recordar con la criptografía es que incluso si el sistema criptográfico se implementa a la perfección, si alguno de los puntos finales está comprometido, el atacante puede acceder a los datos de texto simple. Su microservicio no necesita ser secreto, ni tampoco debe ser separado de su aplicación web principal. Tenerlo en un servidor separado realmente solo agrega complejidad.

La mejor solución, si las API de terceros lo permiten, es almacenar y utilizar tokens OAuth. Solo almacene los tokens / secret API si OAuth no está disponible.

Con respecto a la transmisión de datos al servidor, no necesita implementar su propio cifrado en el navegador. La implementación correcta de SSL resolverá el problema de transmitir la clave de forma segura. Considere el uso de Http Public Key Pinning (HPKP). Tenga en cuenta los peligros potenciales de HPKP antes de implementarlo.

Con respecto al almacenamiento de los tokens, los tokens OAuth / API deben almacenarse en un salado & columna encriptada en la base de datos mediante un cifrado de bloque simétrico, la clave debe almacenarse en algún lugar fuera de la base de datos (para evitar que se exponga a través de un ataque de inyección de SQL), y la aplicación web / trabajo por lotes debe poder acceder a esa clave y descifrar las fichas. La clave que utiliza para cifrar los datos se compartirá en todos los registros y no debe estar disponible fuera del servidor en el que están almacenados sus registros.

    
respondido por el user52472 23.06.2017 - 18:07
fuente

Lea otras preguntas en las etiquetas