Arquitectura de software segura

1

Estoy diseñando una arquitectura de software y necesito algunas sugerencias y aclaraciones sobre algunos problemas.

Esta será una API RESTfull del lado del servidor para acceder a los datos y varios clientes móviles / de escritorio para acceder a la API, recopilar algunos datos y bienes digitales para consumir en los clientes. Se accederá a través de HTTPS

Los clientes serán iOS (Swift 2), Android (Java), Windows Phone (C #), Windows (C #), Windows Store (C #), Mac (Swift 2), Web (C # / JavaScript / HTML), Linux (El lenguaje de programación aún no está claro)

El lenguaje de programación de aplicaciones del lado del servidor será C # en .Net Framework 4.6 y se ejecutará en Azure

Los clientes pueden ejecutarse en una computadora (MAC, PC, Linux), navegador, teléfono inteligente o tableta (iOS, Android, Windows Phone, tienda de Windows)

Los clientes se autenticarán en el servicio REST mediante oAuth 2, luego el miembro se autenticará con su nombre de usuario y contraseña. La identificación única del miembro se almacenará en la base de datos del cliente para autenticar y solicitar a la API los pasos / solicitudes adicionales, ya que no se requerirá inicio de sesión si el miembro cierra la sesión de forma intencionada.

Cuando un miembro solicite desde la API, habrá un proceso de descarga para archivos digitales de tamaño medio (como archivos de video o pdf de aproximadamente 200 mb). Los archivos se cifrarán en el servidor para descifrarlos en el cliente mientras esté consumiendo. Eso significa que descifraremos los productos digitales en tiempo de ejecución, por lo que no se almacenará ningún archivo en el cliente descifrado. Por lo tanto, mi descifrado debe ser muy rápido y de bajo consumo de recursos, pero seguro.

Los miembros podrán registrar, digamos, 3 dispositivos para usar software cliente

Los dispositivos cliente se registrarán automáticamente cuando el miembro use la aplicación por primera vez en el dispositivo.

Los archivos deben consumirse en el cliente si el cliente está registrado, el miembro es válido y el producto digital es comprado por el miembro. Ningún otro miembro o cualquier otro software no podrá consumir productos.

Este es mi enfoque inicial para implementar los requisitos anteriores en el software para que pueda asegurar los productos y el sistema:

  

No pude ingresar todas mis explicaciones aquí porque la forma   Estaba diciendo que esto es un spam. Es por eso que he añadido un enlace a continuación para que   puedo encontrar todas mis notas allí

     

enlace

Aquí mis preguntas;

  • Mantendré la contraseña de mi miembro en la base de datos con hash SHA-512. Usaré SALT para la contraseña. Así que mantendré las claves SALT en la base de datos de cada miembro. ¿Es seguro y está bien implementarlo de esa manera?
  • ¿Debo mantener IV (Vector de inicialización) en la base de datos de cada producto para poder usarlo para el cifrado? Si es así, necesito exponerlo a través de mi API para que el cliente pueda obtenerlo para descifrarlo. ¿Es seguro exponer?
  • Qué algoritmo de cifrado y hash es el mejor para usar en diferentes entornos sin ningún problema. Descifraré archivos en iOS, Android, Windows Phone, Windows, Mac, etc. Todo lo nativo lo sé por un amigo que usó AES-128 y MD5 en el servidor para cifrar, pero enfrenta muchos problemas en diferentes clientes cuando intenta descifrarlos. archivos.
  • Estoy planeando usar AES-256 (Modo de cifrado: CBC, Modo de relleno: PKCS7, con IV) y SHA-512. ¿Algún comentario sobre estas opciones?
  • Almacenaré 2 contraseñas de validación diferentes y 2 contraseñas de cifrado diferentes en la base de datos para poder usarlas con AES y SHA-512. Pero necesito almacenar las mismas contraseñas en el código del cliente como texto codificado para poder descifrar el producto. Pero esta contraseña puede ser robada eliminándola. ¿Cuál es la mejor manera de mantener esta contraseña en el entorno del cliente, así como otra información importante del cliente?
  • Cuando publico las aplicaciones de iOS, Android y Windows Phone, Windows Store, Mac en los mercados, se confunden y firman automáticamente. Firmaré manualmente y ofuscaré mi aplicación de Windows. ¿Es suficiente para proteger mi código contra personas curiosas?
  • Estoy usando algunos datos para cifrar o hash archivos o información. Tengo que exponer esos datos a través de la API para que mis clientes puedan obtenerlos y usarlos para el descifrado. ¿Es seguro hacerlo? ¿Hay alguna otra manera de hacerlo?
  • ¿Alguna sugerencia sobre la arquitectura que explico arriba? ¿Predice algún tipo de vulnerabilidad en el enfoque?

PS: Puedo dar más detalles si necesitamos aclarar algo.

    
pregunta Walt S. 24.07.2015 - 03:37
fuente

1 respuesta

1
  

Mantendré la contraseña de mi miembro en la base de datos con hash SHA-512. voy a   use SALT para la contraseña. Así que voy a mantener las claves SALT en la base de datos para cada   miembro. ¿Es seguro y está bien implementarlo de esa manera?

Sí, si estás usando sal (que deberías), entonces debes almacenar la sal (en el claro) junto al hash.

  

¿Debo mantener IV (Vector de inicialización) en la base de datos para cada   ¿Producto para que pueda usarlo para encriptación? Si es así necesito exponerlo vía   Mi API para que el cliente pueda obtenerla para descifrar. ¿Es seguro exponer?

Depende del esquema / modo de encriptación que esté utilizando, pero como mencionó AES-CBC, no es necesario mantener el IV secreto. El único requisito es que el IV sea aleatorio / impredecible.

  

¿Qué algoritmo de cifrado y hash es mejor utilizar en diferentes   Medio ambiente sin ningún problema. Descifraré archivos en iOS, Android,   Windows Phone, Windows, Mac, etc. Todo nativo lo sé de un amigo   que usó AES-128 y MD5 en el servidor para cifrar pero se enfrenta a muchos   problema en diferentes clientes cuando se intenta descifrar archivos.

Los algoritmos de cifrado y hash son independientes del lenguaje y del sistema operativo, debería poder encontrar implementaciones en la mayoría de los idiomas. AES y la familia SHA son especialmente bien apoyados y ampliamente utilizados. No estoy seguro de los problemas con los que se encuentra su amigo (y, en general, querrá evitar el MD5).

  

Estoy planeando usar AES-256 (Modo de cifrado: CBC, Modo de relleno: PKCS7,   con IV) y SHA-512. ¿Algún comentario sobre estas opciones?

     

Estoy usando algunos datos para cifrar o hash archivos o información. yo tengo   para exponer esos datos a través de la API para que mis clientes puedan obtenerlos y usarlos   Para el descifrado. ¿Es seguro hacerlo? ¿Hay alguna otra manera de hacerlo?

Voy a combinar estos dos puntos. Voy a suponer que cuando dices AES-256 y SHA-512 te refieres a AES para cifrado y SHA como una verificación de integridad del mensaje. Hay un problema con esto: digamos que usted cifra el mensaje y luego calcula el hash para la integridad. Dado que está utilizando el modo CBC, un adversario puede (por ejemplo) hacer un ataque de intercambio de bits y luego vuelva a calcular el hash del texto cifrado modificado y usted no sabría nada. En general, desearía usar un hash con clave (como HMAC) para la integridad y la autenticidad.

Ahora (y hasta su segundo punto), hay algo que se llama Cifrado autenticado con datos adicionales (AEAD) que realmente se ocupará de los problemas tratados en el párrafo anterior (proporcionará confidencialidad, integridad y autenticidad sin tener que construir un esquema a partir de primitivas). También permitirá que algunos datos (los datos adicionales) se mantengan en claro, pero aún así garantizará la integridad de esos datos. Mire el modo GCM (por ejemplo, AES-GCM).

  

Almacenaré 2 diferentes contraseñas de validación y 2 diferentes   Contraseña de cifrado en la base de datos para que pueda usarla con AES y SHA-512.   Pero necesito almacenar las mismas contraseñas en el código del cliente como codificadas   texto para que pueda descifrar el producto. Pero esta contraseña puede ser robada por   desenfocándolo ¿Cuál es la mejor manera de mantener esta contraseña 4 en el   ¿Entorno del cliente así como otra información importante del cliente?

No soy un experto en este aspecto, pero le recomendaría encarecidamente que no introduzca una contraseña en el cliente. Cualquier atacante razonablemente inteligente podrá recuperar esta contraseña en un tiempo mínimo, por lo que realmente no se gana seguridad aquí.

  

Cuando publico aplicaciones iOS, Android y Windows Phone, Windows Store, Mac   A los mercados, entonces se están confundiendo y firmando.   automáticamente. Firmaré manualmente y ofuscaré mi Windows   Solicitud. ¿Es suficiente para proteger mi código contra personas curiosas?

Entiendo que el código de firma / una aplicación es para demostrar la autenticidad del código al usuario final, para garantizar que un adversario no haya rechazado el código / la aplicación que descargó o algo por el estilo, y no para Hacer más difícil la descompilación / ingeniería inversa. La ofuscación también puede no ser suficiente para evitar que un adversario dedicado descubra cómo funciona su fuente o recuperar datos confidenciales en su código. Siempre me ha parecido un caso de seguridad a través de la oscuridad .

    
respondido por el puzzlepalace 24.07.2015 - 09:22
fuente

Lea otras preguntas en las etiquetas