Tengo una aplicación móvil que necesita poder enviar imágenes de forma segura a otros teléfonos móviles. He intentado investigar esto y tengo una idea en mi mente de cómo podría funcionar, pero quiero que algunos de ustedes la pasen para estar seguros.
Definiciones:
- Teléfono de recepción: el teléfono que recibirá las imágenes. Podría haber múltiplos de estos.
- Enviando teléfono: el teléfono que enviará fotos. Podría haber múltiplos de estos.
- Cuenta: agrupación de teléfonos receptores y de envío.
Pasos:
- Uno o más teléfonos receptores están registrados en la cuenta. Cada uno de ellos crea un par de llaves RSA de 2048 bits utilizando el almacén de claves de Android o el llavero de iOS. La clave pública se envía al backend donde se guarda. Mi comprensión (y de la experimentación) es que la clave privada NO SE PUEDE extraer del llavero de Android Keystore / iOS. *
- Antes de enviar una foto, un teléfono emisor descarga TODAS las claves públicas de los teléfonos receptores. Luego genera una clave de 256 AES (probablemente usando CBC?) Que usa para cifrar la foto. Esa clave se encripta luego utilizando las claves RSA públicas s descargadas desde el servidor backend. La imagen cifrada, las claves AES cifradas y otra información (¿IV? ¿Debería estar también cifrada?) Se envía al servidor de backend donde se guarda.
- Los teléfonos receptores descargan las imágenes del servidor backend, descifran la clave AES usando su clave privada de su almacén de claves / llavero, luego descifran las imágenes usando la clave AES.
- Todas las imágenes se eliminan del servidor backend después de 14 días.
* Entiendo que si un teléfono desinstala la aplicación, el KeyPair se pierde y está BIEN.
Nota: el servidor backend guardará las imágenes cifradas en un volumen cifrado, y toda la comunicación se realizará a través de https. Puede suponer que el acceso al servidor back-end requerirá autorización, y se debe (intentar) controlar. Si bien eso puede tener implicaciones de seguridad, quiero enfocar más esta publicación en las imágenes (¿si eso funciona?). Si necesita más detalles sobre el sistema, hágamelo saber.
Preguntas :
- ¿Qué tan seguro parece esto? ¿Qué me he perdido? ¿Qué más debo considerar? (no soy experto en seguridad)
- En el caso de que alguien HACE piratear mi backend y tenga acceso a las imágenes encriptadas, ¿qué tan seguras son las fotos? (Mi objetivo es lograr que el "pirata informático" también tenga que piratear el teléfono de los usuarios para descifrar las imágenes).
- ¿Es un problema que tenga la misma clave AES cifrada con potencialmente múltiples claves públicas RSA?