Almacenamiento seguro de datos secretos en una aplicación web del lado del cliente

11

Tengo esta aplicación web que será toda la tecnología del lado del cliente (HTML, CSS, JavaScript / AngularJS, etc.). Esta aplicación web va a interactuar con la API REST para acceder y modificar datos. En este momento no está decidido qué tipo de sistema de autenticación utilizará la API REST.

Según tengo entendido, cualquier tipo de sistema de autenticación API (API Keys, OAuth 1/2, etc.) tendrá ciertos datos que deben mantenerse en secreto, de lo contrario el acceso puede verse comprometido. Para las claves API, las claves deben ser secretas, para OAuth 2 el secreto del cliente / tokens de acceso / tokens de actualización deben mantenerse en secreto, estoy seguro de que algunas de las 4 claves involucradas en OAuth 1 deben mantenerse en secreto (no demasiada experiencia con OAuth 1). He estado tratando de pensar si hay una manera de almacenar estas cosas secretas en una aplicación web pura del lado del cliente sin una capa intermedia en el lado del servidor.

He estado tratando de pensar en esto y no se me ocurre ningún lugar para hacerlo. Quiero decir que no puedo almacenarlo en JavaScript porque cualquiera puede ver la fuente o abrir la consola y obtener los datos. No estoy 100% seguro de cuán seguro es localStorage y si los usuarios pueden acceder / modificar esos datos. Incluso si el almacenamiento local fuera seguro, las dos formas en que puedo pensar en ingresar datos no lo son. Una forma es simplemente almacenar los datos en el código fuente de JavaScript, que es lo más inseguro que se me ocurre. Ahora, si estaba usando algo como OAuth 2 en el que la API del resto me daría los tokens, eso aún no sería tan seguro (mejor que la primera opción) porque esos tokens serían devueltos como texto sin formato para que cualquiera que pueda ver el solicitudes que la computadora está haciendo podría ver.

¿Hay alguna forma de tener una aplicación que se esté ejecutando completamente en el lado del cliente para poder almacenar datos secretos de forma segura sin algún tipo de capa intermedia en el lado del servidor?

ryanzec
fuente
Localstorage es específico del navegador, pero tomando Opera en Windows como ejemplo, son solo algunos archivos de disco en la carpeta de perfil del usuario, por lo que está esencialmente desprotegido.
Ross Patterson
Una forma sería mantener el secreto en el servidor en una base de datos y solo tener application_id en el cliente. Luego realice la consulta oauth desde el servidor, por lo que este es un tipo de enfoque proxy.
Simon Polak

Respuestas:

9

No, nunca puede ser completamente seguro. El usuario tiene el control del hardware y usted está tratando de mantener algo fuera de sus manos. En última instancia, PUEDEN obtenerlo a través de un medio u otro. Como está trabajando desde javascript, su posición es MUCHO peor que una aplicación de computadora normal, ya que el usuario no solo controla el hardware, sino que también controla el sandbox en el que se está ejecutando.

Puede ocultar cosas y dificultar el acceso a las cosas, pero al final PUEDEN sacarlas, si se esfuerzan lo suficiente.

Michael Kohne
fuente
44
^ esto. ¿Cuán "secretos" son los datos secretos, y cuánto tiempo y dinero está protegiendo realmente? Los esfuerzos "estándar de la industria" podrían ser suficientes.
DaveE
+1 Excelente respuesta. Con un depurador de JavaScript, puedo alterar su aplicación, ver valores intermedios, etc. Si quiero la información, la obtendré.
Ross Patterson el
2

Al diseñar sistemas de seguridad, uno siempre necesita pensar en el modelo de amenaza. " Hacerlo seguro " es un requisito tonto, no procesable o verificable. " Evitar que el usuario extraiga los tokens de acceso de la aplicación " es mucho mejor y define los límites de la solución. " Evitar que otros obtengan tokens de acceso de un usuario " también es mejor y define un espacio de solución completamente diferente. Las soluciones para una no necesariamente resolverán la otra ( p . Ej. , Esta última requiere SSL si se trata de WiFi, pero eso no afectará en absoluto a la primera).

Ross Patterson
fuente
0

una opción es que la API REST otorgue acceso o no se base en un inicio de sesión de usuario; puede devolver un token basado en sesión (guid, cadena hash, lo que desee) que se puede pasar a las otras llamadas a la API REST para autenticar el acceso

si le preocupa almacenar la información de inicio de sesión del usuario en la máquina cliente, no lo haga, pero el usuario deberá ingresar la información de cuenta y contraseña cada vez

no estoy tan familiarizado con OAuth et al, pero no veo ninguna razón convincente para almacenar la información de autenticación de manera persistente ...

Steven A. Lowe
fuente
En cuanto a las razones, siempre hay "comodidad", que obviamente es el archienemigo de "seguridad" y "seguridad".
henon