Imagine las aplicaciones web que se supone que funcionan sin o con algunas interacciones con el servidor web, por ejemplo:
- un juego de navegador en el que el nivel y el progreso del jugador se guardarán localmente.
- un juego, una aplicación web progresiva o una extensión de navegador con la posibilidad de realizar compras dentro de la aplicación en las que las funciones desbloqueadas y pagadas se guardarán localmente.
En cada caso, se debe descartar la manipulación de esos datos críticos en el lado del cliente. Por ejemplo, se debe evitar que el usuario "haga trampa" accediendo y manipulando el almacén de datos local, ya sea el almacenamiento local o un IndexedDB, a través de la consola del desarrollador.
Entiendo que con la Web Crypto API, la clave de, digamos, un cifrado AES-GCM, se puede guardar como un tipo de clave criptográfica especial en IndexedDB y, por lo tanto, todavía se puede utilizar localmente, pero no se puede ver debido a su opacidad . Sin embargo, un esquema ingenuo que consiste en la aplicación web que guarda la clave criptográfica, el vector de inicialización y las compras en progreso / dentro de la aplicación cifradas en IndexedDB se podría comprometer fácilmente ya que el usuario simplemente podría usar la clave y iv para descifrar y luego volver a cifrar la datos.
Las cosas podrían mejorar si la clave se almacenara en el servidor, pero esto anularía el objetivo de reducir la interacción del servidor y, además, necesitaríamos un esquema que evite que el usuario solicite esa clave al servidor, como lo hace la aplicación web.
Me gustaría poner tus cerebros en esto. ¿Crees que lo que me propuse hacer es factible y sí, qué aspecto tendría una solución?