Estoy probando de hacer una webapp con phonegap y JQueryMobile, la App simplemente hace unas consultas a unos webservice y muestra información. Me voy encontrando con distintos problemas que más o menos voy solucionando, pero este me gustaría profundizarlo.
Lo primero que hace la App, es ir a una pantalla de login, allí pide un usuario y contraseña que valida, si es ok guardo en el localStorage el código de usuario y en las siguientes peticiones, envío este código de usuario.
Mi duda es con este procedimiento puede haber un fallo de seguridad, sabiendo las urls del webservice, viendo las peticiones y probando usuarios, podrían llegar a suplantar a este usuario.
He pensado que en cada petición se envíe el uuid que obtengo con phonegap y lo valide en el servidor como si fuese una sesión, o que al devolver el código de usuario, me devuelva un token (un string generado por mi), para enviar el usuario y token en cada petición, pero al ser datos que se guardan en el storage y van en texto plano al hacer las peticiones, se podrían llegar a interceptar y suplantar la identidad del usuario.
Mi pregunta es cómo se puede resolver esto? ¿Cómo lo hacen las Apps de renombre?
A ver si me podéis orientar sobre que protocolos o temarios son los que se usan para poder buscar información, o como resolvéis esto vosotros con vuestras App.
Yo me encontré con el mismo problema en el desarrollo de una API RESTful, yo opté por utilizar una variación del algoritmo de secreto compartido que es bastante conocido. No es tampoco la gran panacea, pero sin embargo es mucho más seguro que tu caso.
El mismo consiste en tener una clave pública, que viaja en plano en las peticiones y una clave privada que conoce el consumidor del servicio (que guarda de manera protegida - cifrada) y el servicio (guardada seguramente); las peticiones, se firman con la clave privada, y la clave privada nunca viaja en plano.
Para entenderlo un poco mejor, puedes ver cómo lo hace Marvell en su API, concretamente aquí: http://developer.marvel.com/documentation/authorization
Si las clave privada no se intercepta, si la guardas de manera segura, como mucho pueden volver a hacer la petición n veces, en este caso, yo lo que hago es controlar, por medio de un timestamp, que también es usado para firmar el mensaje, hasta cuánto tiempo un conjunto de datos (timestamp + firma mensaje + mensaje) es válido.
Hombre, empieza por usar https para que los datos no viajen en plano
Lo de usar el UUID, aunque sea un código único del dispositivo, el que vea la petición solo tiene que usar el mismo UUID, si te quieren suplantar lo harán desde un ordenador, no desde la App, poniendo los datos que te cogen a ti, asi que podría suplantar usuario y dispositivo a la vez.
Luego ya hay muchas formas de hacerlo, no sabría decirte cual es la mejor, mira por ejemplo el oauth 2 http://oauth.net/2/
Julio tiene toda la razón, is imprescendible que la API sólo acepte peticiones HTTPS, a mí se me olvidó comentarlo. Hoy en día HTTPS/SSL/TLS se puede crackear bajo ciertas condiciones.
Tienes que conseguir una librería de cifrado, yo desconozco el mundo de los dispositivos móviles; pero bueno, te puedo recomendar, por ejemplo, Bouncy Castle: https://www.bouncycastle.org/.
Implementar tu propio algoritmo de cifrado no es una buena idea, por muchas razones, de verdad que la más básica es que son mucho más seguras que la que uno pueda hacer sin invertir muchos recursos.
Si te apetece cacharear, mira lRapi, que escribi hace tiempo, cuando me toco desarrollar una API para una aplicacion movil... como base, yo creo que sirve.
Estoy probando de hacer una webapp con phonegap y JQueryMobile, la App simplemente hace unas consultas a unos webservice y muestra información. Me voy encontrando con distintos problemas que más o menos voy solucionando, pero este me gustaría profundizarlo.
Lo primero que hace la App, es ir a una pantalla de login, allí pide un usuario y contraseña que valida, si es ok guardo en el localStorage el código de usuario y en las siguientes peticiones, envío este código de usuario.
Mi duda es con este procedimiento puede haber un fallo de seguridad, sabiendo las urls del webservice, viendo las peticiones y probando usuarios, podrían llegar a suplantar a este usuario.
He pensado que en cada petición se envíe el uuid que obtengo con phonegap y lo valide en el servidor como si fuese una sesión, o que al devolver el código de usuario, me devuelva un token (un string generado por mi), para enviar el usuario y token en cada petición, pero al ser datos que se guardan en el storage y van en texto plano al hacer las peticiones, se podrían llegar a interceptar y suplantar la identidad del usuario.
Mi pregunta es cómo se puede resolver esto? ¿Cómo lo hacen las Apps de renombre?
A ver si me podéis orientar sobre que protocolos o temarios son los que se usan para poder buscar información, o como resolvéis esto vosotros con vuestras App.
Muchas gracias
04/10/2014 20:41
Yo me encontré con el mismo problema en el desarrollo de una API RESTful, yo opté por utilizar una variación del algoritmo de secreto compartido que es bastante conocido. No es tampoco la gran panacea, pero sin embargo es mucho más seguro que tu caso.
El mismo consiste en tener una clave pública, que viaja en plano en las peticiones y una clave privada que conoce el consumidor del servicio (que guarda de manera protegida - cifrada) y el servicio (guardada seguramente); las peticiones, se firman con la clave privada, y la clave privada nunca viaja en plano.
Para entenderlo un poco mejor, puedes ver cómo lo hace Marvell en su API, concretamente aquí: http://developer.marvel.com/documentation/authorization
Si las clave privada no se intercepta, si la guardas de manera segura, como mucho pueden volver a hacer la petición n veces, en este caso, yo lo que hago es controlar, por medio de un timestamp, que también es usado para firmar el mensaje, hasta cuánto tiempo un conjunto de datos (timestamp + firma mensaje + mensaje) es válido.
Espero que te ayude mi respuesta.
Gracias,
Daniel
05/10/2014 14:11
Lo de usar el UUID, aunque sea un código único del dispositivo, el que vea la petición solo tiene que usar el mismo UUID, si te quieren suplantar lo harán desde un ordenador, no desde la App, poniendo los datos que te cogen a ti, asi que podría suplantar usuario y dispositivo a la vez.
Luego ya hay muchas formas de hacerlo, no sabría decirte cual es la mejor, mira por ejemplo el oauth 2 http://oauth.net/2/
06/10/2014 18:14
Otra pregunta para guardar de manera segura la clave privada en el dispositivo ¿como lo haríais?
07/10/2014 18:20
Julio tiene toda la razón, is imprescendible que la API sólo acepte peticiones HTTPS, a mí se me olvidó comentarlo. Hoy en día HTTPS/SSL/TLS se puede crackear bajo ciertas condiciones.
Tienes que conseguir una librería de cifrado, yo desconozco el mundo de los dispositivos móviles; pero bueno, te puedo recomendar, por ejemplo, Bouncy Castle: https://www.bouncycastle.org/.
Implementar tu propio algoritmo de cifrado no es una buena idea, por muchas razones, de verdad que la más básica es que son mucho más seguras que la que uno pueda hacer sin invertir muchos recursos.
Por ejemplo, para android e IOS:
- http://developer.android.com/reference/javax/crypto/package-summary.html
- https://developer.apple.com/library/mac/documentation/security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html
Espero que te ayude,
Daniel.
13/10/2014 15:20
15/10/2014 16:01
http://w0rldart.github.io/lRapi/