2011-04-22 10 views
8

Tengo la tarea de diseñar un sistema que permita a nuestros usuarios iniciar sesión en sus cuentas e interactuar con nuestro servicio utilizando sus teléfonos móviles. Sin embargo, me preocupa la seguridad de la aplicación.Seguridad API de móvil a servidor

Básicamente, permitimos que las personas inicien sesión a través de OAuth usando Facebook o Twitter. La aplicación móvil (construida con titanio Appcelerator) debería hacer eso también. Tras un inicio de sesión exitoso en el teléfono, debo notificar a mi aplicación que alguien inició sesión con FB o Twitter para que mi aplicación pueda recuperar el ID de usuario específico de la aplicación del usuario.

Mi primer pensamiento fue escribir una API que el teléfono podría llamar para aceptar parámetros como el userId de Facebook o Twitter. Preguntaría en mi base de datos y encontraría su identificación de usuario interna y la devolvería al teléfono.

Esto funcionaría bien, pero es completamente inseguro. Cualquiera podría golpear esa misma API con una identificación de usuario de Facebook y la API simplemente devolvería la ID interna (y cualquier otro dato que necesite la aplicación) sin saber si la solicitud está autorizada.

Esta es mi primera aplicación móvil, por lo que no estoy seguro de la forma correcta de implementar seguridad en mi API.

+0

Cómo trabajaste con eso? Tengo el caso de uso exactamente similar – daydreamer

Respuesta

-6

La mayoría de las configuraciones de API incluyen algún tipo de clave secreta o APIKey que es exclusiva del desarrollador. Como usted es el único desarrollador, puede simplemente configurar una clave/hash en su aplicación móvil que se transfiere también para una devolución de datos exitosa.

http://lcsd05.cs.tamu.edu/slides/keynote.pdf es una nota clave dada por Google sobre el diseño de una buena API desde cero.

También puedes ver este previous question

+0

Gracias, pero esto no ayuda mucho, y el problema no es sobre un buen diseño de API. Mi preocupación es que no hay forma de * saber * quién está enviando una solicitud a mi API. El teléfono golpeará la API con algunos parámetros de solicitud, pero un hacker podría fácilmente generar una solicitud similar a mano. ¿Cómo podría evitar eso? –

+2

Una clave secreta solo funciona cuando no la distribuye. No puedo poner una clave secreta en un dispositivo del lado del cliente porque cualquiera puede descompilar la aplicación o husmear el tráfico para exponer la clave secreta. Entonces ya no es un secreto. –

+1

@ bh88: cualquier información que la aplicación necesite enviar al servidor puede descompilarse, así que cualquier cosa que la aplicación pueda hacer, se puede copiar – user102008

2
  1. Si es posible, utilizar https, y un montón de problemas resueltos.
  2. momento de la conexión con éxito, puede crear una sesión y pasar sessionid al cliente, aquí os asesoramiento a enviar el sessionid con forma de RSA (para el caso de que alguien pueda sniffer su sessionid)
  3. uso de firma hash para asegurarse la solicitud no se modifica en el camino, pero este método no puede evitar el problema de reenvío.

Finalmente, para su problema, si hay un nuevo progreso, hágamelo saber, gracias!

2

También me he enfrentado a este problema, autenticar al usuario es bastante sencillo pero autenticar el dispositivo es mucho más difícil. Como dijo, cualquiera puede conectarse a su API y presentar un usuario autenticado a través de Facebook y acceder a su API.

Puede manejarlo con la autenticación SSL mutua pero si la clave se ve comprometida en un solo dispositivo móvil toda la API se ve comprometida ya que todos los dispositivos usarían el mismo par de claves que vino con la aplicación cuando se instaló.

Lo que finalmente hice fue obligar al dispositivo a registrarse con mi API cuando la aplicación se instaló por primera vez. El dispositivo realiza una llamada API a mi servidor y se emite un secreto de clave API que luego debe usar para realizar todas las demás llamadas a la API. Esto no es seguro ya que puede escribir un script para registrarse y obtener una clave API, pero me permite monitorear el uso de API y apagar dispositivos que se comportan mal.

Eso es lo mejor que se me ocurrió, una forma de bloquear dispositivos no autorizados que identifiqué fuera de banda.

0

Tuve el mismo problema y lo resolví creando mi propia API (PHP) en combinación con un servidor proxy (NodeJS). Cada solicitud de mi cliente se envía al servidor proxy, el servidor proxy valida la solicitud y la pasa a mi API. La API solo permite que las solicitudes del servidor proxy sean su IP.

Primero, el usuario se autentica con el servidor proxy mediante el uso del encabezado Authorization; si tiene éxito, el usuario obtendrá 2 tokens. Un token de acceso y un token de actualización. El token de acceso se utiliza para realizar solicitudes y vidas durante 5 minutos en mi caso. Cuando el token de acceso ha caducado, el usuario puede actualizar el token con el token de actualización que permanece para siempre.

Cree un módulo global en su aplicación que maneje su lógica de teclas, almacene las claves en sus propiedades locales y úselas cuando el usuario reinicie la aplicación para que no tengan que volver a iniciar sesión cada vez.

Si utiliza esto con HTTPS, las claves no se pueden olfatear y no puede recuperar las claves si descompila la aplicación porque están almacenadas en el dispositivo de los usuarios y no están 'codificadas' en la propia aplicación. Técnicamente, si el atacante tiene el dispositivo del usuario, él puede descompilar la aplicación y recuperar las claves. Lo sé, pero si ya tiene acceso al dispositivo físico, podría usar cualquier aplicación de todos modos.

El servidor proxy también registra todas las solicitudes entrantes y me notifica por correo electrónico cuando alguien está probando trucos (yo mismo lo creé). He utilizado los siguientes módulos:

  • expresan
  • https
  • proxy HTTP (proxies la solicitud a mi API)
  • jsonwebtoken (genera y valida los tokens de acceso/refresco)
Cuestiones relacionadas