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

15

Necesito crear una API de servicios web para que nuestra aplicación móvil interactúe con nuestro servidor & 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 se registren 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 desea todos nuestros datos o que crean una aplicación no oficial) sean rechazadas?

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

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

    
pregunta Antoine 28.04.2013 - 12:06
fuente

1 respuesta

15

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

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

Imagina 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 cifrado con una clave pública. Esta clave pública está asociada con el identificador único enviado anteriormente.
  3. El cliente resuelve el desafío descifrando los datos usando una clave privada y envía el secreto descifrado al servidor.
  4. El servidor verifica que el secreto enviado corresponde al generado originalmente.

El desarrollador que hackeará su aplicación y obtendrá con éxito la clave privada podrá usar 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, lo que significa que este desarrollador podría usar su aplicación por sí mismo y tal vez entregarla a su amigos, pero él no podría, por ejemplo, venderlo a miles de personas, solo porque funcionará solo por unos minutos en la mañana.

Si bien esto ayuda, no es una prueba del 100%. ¿Qué sucede si el pirata informático encuentra una forma 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 aún así puede ser útil: no piense en una API como herramienta para su producto principal (aplicación móvil ). Piénselo como un producto de primera clase, un producto que puede pagarse. Amazon y Google utilizan el mismo modelo durante años, y comienzan a usarlo activamente. Microsoft con Azure, etc.

Tan pronto como considere que la API no es una herramienta secundaria reducida a la esclavitud para sus nuevas aplicaciones móviles, sino el producto real, al mismo nivel que cualquier aplicación que realmente vea el usuario, comienza a pensar menos en cómo proteger. la API contra el uso por parte de otras aplicaciones, y más sobre la monetización de la API . 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 la usen sus aplicaciones es difícil y costoso. Este tiempo y dinero se pueden usar 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 creaste 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 escondes tu API, la única Lo que la gente sabrá es que usted ha 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 aplicaciones geniales para él, y le traerán mucho dinero.

  • Nunca imaginas cómo otras personas pueden usar tus API. Esto es lo que pasó 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 sanitario, etc. Es similar a las API web: más desarrolladores lo están utilizando, más generalizadas serían las ideas. p>

respondido por el Arseni Mourzenko 28.04.2013 - 12:35
fuente

Lea otras preguntas en las etiquetas