Imagina que tienes una aplicación web que cifra los datos del usuario, como una nota o una hoja de cálculo, tanto en el servidor como en el cliente.
El proceso normal para un usuario que utiliza esta aplicación web es algo como esto:
- El usuario inicia sesión en la aplicación utilizando un hash de inicio de sesión / contraseña almacenado en el servidor. (Como las aplicaciones web normales).
- El usuario ingresa una clave segura adicional que se usa para cifrar los datos del lado del cliente. La aplicación web utiliza una biblioteca de cifrado del lado del cliente como SJCL
En este ejemplo, centrémonos en el lado del cliente.
La situación es la siguiente: el servidor se ha visto comprometido y un atacante tiene acceso a las claves del lado del servidor. El atacante no tiene las claves del lado del cliente, ya que nunca se almacenan en el servidor.
Ahora el atacante debe modificar el Javascript para leer la clave del lado del cliente cuando el usuario ingresa en la aplicación web (lado del cliente). El Javascript estaría programado para enviar la clave al atacante / servidor. Ahora el atacante ha ganado.
Comprendo que se asume que una vez que se haga cargo del servidor, se habrá perdido, pero me gustaría saber si mis ideas a continuación permiten una solución segura para el cliente.
La situación
Se asume que el HTML contiene algo de código Javascript dentro de algunas etiquetas de script, y también hay una gran cantidad de código Javascript cargado a través de archivos Javascript externos que residen en el servidor. Es el Javascript que ejecuta la aplicación web que es el problema. Tenemos que asumir que el atacante ha modificado cualquier Javascript, sea en línea o externo.
¿Posible solución?
Quiero poder generar un hash de todo el Javascript cargado desde mi servidor. La cuenta actuará como una huella digital para el código Javascript del lado del cliente y el usuario desconfiará de un nuevo hash.
Estas son las dos formas en las que he pensado hasta ahora:
-
Tome un hash de todos los archivos cargados en el cliente. Esto significa solicitar de nuevo todos los archivos incluidos.
-
Toma un hash de todo el código Javascript en la memoria. (¿Se puede hacer esto?)
El problema común con ambas opciones es que cualquiera que sea la función que realice este hash, debe ser lo suficientemente pequeña para que el usuario en cuestión pueda verificar que es seguro usarla en unos pocos segundos.
Estoy pensando que esta función de hash se carga en el navegador como de costumbre, y el usuario puede escribir el nombre de la función desde la consola sin el ()
para que puedan ver el código, y luego escribir nuevamente con ()
para ejecutar el código.
Entonces, el hash debe ser lo suficientemente bueno para probar que la aplicación web está en un estado que el usuario sabe que ha inspeccionado en el pasado.
Esto podría incluso convertirse en un complemento en algún momento, aunque estoy determinado a ver si es posible una solución nativa.
Esencialmente, lo que estoy preguntando es: ¿qué métodos existen que nos permitan probar la integridad del estado del cliente?