Tengo una aplicación web que espero escribir donde se comprime y encripta una selección de archivos en el navegador antes de subirlos a mi servidor. Tengo un prototipo del sistema y está funcionando muy bien. Quiero hacerlo en el navegador sin la participación del servidor cuando se manejan los archivos no cifrados por motivos de privacidad.
El proceso general es:
- El usuario selecciona archivos locales en su computadora
- Comprime esos archivos juntos
- generar una clave
- Encripta el zip con la clave
- Cargue el zip cifrado en el servidor (este es verificadamente el primer uso de la red después de cargar la página)
Mi objetivo es saber lo menos posible sobre el paquete cargado. Zipping significa que no sé cuántos archivos hay y porque las claves son todas del lado del cliente administrado, no hay absolutamente ninguna manera de poder descifrar el paquete. Mi servicio tiene que ver con el almacenamiento, por lo que nunca necesito transmitir la clave a ningún lugar. La clave está disponible para que el usuario la administre personalmente.
Me doy cuenta de que el uso de la seguridad de javascript permite a mis clientes manipular los valores para invalidar la seguridad, pero como solo son capaces de modificar el código que los afecta, un usuario solo puede debilitar la seguridad de los paquetes que cargan. Supongo que un usuario que se esfuerce por dispararse en el pie no es un problema que deba intentar evitar.
MITM parece una posibilidad. Eve podría manipular los archivos JS solicitados para eliminar el cifrado y Eve podría recuperar un paquete no cifrado durante la carga, pero no creo que esto presente ningún problema nuevo en un sistema donde el paquete se envía a mi servidor y luego se cifra. HTTPS y un usuario bien educado pueden ayudar a evitar que un MITM también tenga éxito. "Usuario bien educado" puede ser un sueño imposible, pero puedo hacer mi parte para intentar educar a mis usuarios antes de que comience el proceso.
El último y hasta ahora peor problema que se me viene a la mente es la posibilidad de una extensión de navegador malintencionada. Podría manipular el JS para eliminar el cifrado, pero la carga aún sería segura utilizando una conexión HTTPS forzada (el servidor puede rechazar las cargas no seguras). Desde que leí en archivos usando la API FileReader de Javascript, una extensión maliciosa podría interceptar el blob sin cifrar y cargarlo a un tercero. ¿Cómo podría defenderme de algo así? Sé que mi sitio y los servidores no han sido violados, pero esto sigue siendo una gran pérdida para mis clientes. ¿Se puede hacer algo al respecto?
Si la conexión con el servidor es 100% HTTPS, ¿qué tipo de ataques podrían dirigirse a un sistema como este? ¿Hay problemas en los que no haya pensado que debo prepararme? ¿Qué puedo hacer para garantizar la seguridad y la privacidad?