¿Cuáles son las mejores prácticas para asegurar una API web?

15

Necesito crear una API de servicio web para que nuestra aplicación móvil interactúe con nuestro servidor y base de datos (en ASP.Net MVC 4, pero eso no es relevante). Si bien la mayoría de las acciones no necesitan que los usuarios estén registrados en nuestro servicio, nos gustaría restringir el acceso solo a los usuarios de nuestra aplicación.

¿Cuáles son los métodos para asegurarse de que las llamadas realizadas desde otro lugar (por ejemplo, alguien que quiere todos nuestros datos o que está creando una aplicación no oficial) sean rechazadas?

Mi idea inicial es que el dispositivo solicite al servidor un token, que se genera aleatoriamente y se envía tal cual. Todos los demás métodos verificarán que los encabezados de solicitud contengan uno específico que será md5 hash del token salado. El servidor conoce el token y la sal y puede calcular el hash y compararlo con el enviado. Además, el token tiene una vida útil limitada y el dispositivo debe obtener otro cada dos horas.

Parece bastante fácil de implementar y, aunque probablemente no sea 100% a prueba, parece ser una buena idea. ¿Qué piensas?

Antoine
fuente

Respuestas:

15

Tan pronto como lance la aplicación, es posible que tenga ingeniería inversa. Esto significa que no hay nada que pueda hacer para estar 100% protegido si la misma aplicación (los mismos binarios, la misma configuración) se distribuye a todos sus usuarios.

Si puede personalizar la aplicación para cada usuario, entonces tiene la posibilidad de no prohibir que alguna otra aplicación use su API, pero al menos limite esta aplicación por el número de solicitudes que puede hacer a la API.

Imagine el siguiente esquema:

  1. El cliente se conecta y envía su identificador único (un identificador por usuario).
  2. El servidor responde enviando un desafío encriptado con una clave pública. Esta clave pública está asociada con el identificador único enviado previamente.
  3. El cliente resuelve el desafío descifrando los datos utilizando una clave privada y envía el secreto descifrado de vuelta al servidor.
  4. El servidor verifica que el secreto enviado corresponde al generado originalmente.

El desarrollador que pirateará su aplicación y obtendrá con éxito la clave privada podrá utilizar su API desde su propia aplicación, pero será el identificador como él mismo para su servidor.

Si el mismo usuario puede hacer 10 000 solicitudes a su API por día y, en promedio, un usuario activo realiza 2 000 solicitudes por día, significa que este desarrollador podría usar su aplicación él mismo y tal vez dársela a sus amigos, pero no podría, por ejemplo, venderlo a miles de personas, solo porque funcionará solo durante unos minutos por la mañana.

Si bien esto ayuda, tampoco es 100% a prueba. ¿Qué sucede si el hacker encuentra una manera de extraer la clave privada de su aplicación cuando su propia aplicación está instalada en el dispositivo?


Nota al margen que no responde a su pregunta, pero que podría ser útil: no piense en una API como herramienta para su producto principal (aplicación móvil). Piense en ello como un producto de primera clase en sí mismo, un producto que puede pagarse. Amazon y Google usan el mismo modelo durante años, Microsoft comienza a usarlo activamente con Azure, etc.

Tan pronto como considere que la API no es una herramienta secundaria reducida a la esclavitud de sus nuevas y brillantes aplicaciones móviles, sino el producto real, al mismo nivel que cualquier aplicación que el usuario realmente vea, comienza a pensar menos sobre cómo proteger la API contra el uso por otras aplicaciones, y más sobre la monetización de la API en sí. Dicha API puede ser utilizada por sus aplicaciones que son sus clientes, o cualquier otra aplicación, desarrollada libremente por cualquier persona. Esto tiene varios beneficios:

  • Hacer una API para que solo sea utilizado por sus aplicaciones es difícil y costoso. Este tiempo y dinero pueden usarse para algo más útil.

  • Abrir su API al público puede tener un gran beneficio tanto para usted como para el mundo. Imagina que eres un gran arquitecto y un gran desarrollador, por lo que has creado una API asombrosamente genial, pero tus habilidades de diseñador visual apestan y realmente no entiendes nada sobre el diseño de interacción, etc. Si ocultas tu API, el único Lo que la gente sabrá es que has creado una aplicación móvil que es inutilizable y fea. Si su API es pública, otros desarrolladores se sentirán atraídos por su calidad y escribirán excelentes aplicaciones para él, lo que le brindará mucho dinero.

  • Nunca imaginas cómo otras personas pueden usar tus API. Esto es lo que sucedió con Kinect. Originalmente, Microsoft creó Kinect para juegos. Cuando Microsoft abrió la API al público, nunca imaginaron que sería utilizada unos años más tarde por aplicaciones científicas, sector de la salud, etc. Es similar para las API web: más desarrolladores la están utilizando, más generalizadas serían las ideas.

Arseni Mourzenko
fuente
Muy interesante respuesta. Probablemente necesitemos pensar cómo podemos hacer pública la API. También como referencia, el mercado objetivo en Francia, donde la ingeniería inversa y el desmontaje son ilegales, por lo que debemos preocuparnos demasiado por esto.
Antoine
2
@Antoine: Revere Engineering sería ilegal en cualquier país tan pronto como la licencia lo prohíba. Pero el hecho de que sea ilegal no significa que nadie reverenciará la ingeniería de su aplicación.
Arseni Mourzenko