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í
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.