¿Cómo puedo evitar que alguien se comunique con mi servidor, excepto mi aplicación de Android?

Tengo un servidor de descanso en el motor de aplicaciones de Google y sólo quiero que mi aplicación para poder hacer llamadas a mi servidor.

¿Hay una opción de seguridad que pueda activar en el motor de aplicaciones de Google que facilitará esto? Si no que qué puedo hacer?

Sé que puede restringir el acceso a algunas páginas con el siguiente, pero no estoy seguro de que se puede aplicar a las llamadas REST

<security-constraint> <web-resource-collection> <url-pattern>/cron/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint> 

Generar privatekey / publickey par en openssl. En la distribución de la aplicación, distribuya la clave pública. Tener una cabecera de http personalizada llamada appName y cifrar el nombre de la aplicación (un único número impredecible bit grande impredecible) y enviarlo. Asegúrese de que su código se obscurece para que nadie pueda ver el nombre de la aplicación. Entonces, dado que está encriptando incluso si alguien rastrea las llamadas http, el nombre de la aplicación estará visible como valor cifrado. En su extremo del servidor descifrar el appname usando la llave privada. Espero que esto ayude.

(Tres respuestas ya, y todas con diferentes ideas entonces la mía sobre este asunto – por lo que una buena pregunta, creo).

Era mi entendimiento que la manera recomendada / canónica de hacer esto (para google) es OATH2. Google ha reconocido que OATH2 es difícil, y uno de sus intentos de simplemente es los puntos finales de la nube, junto con Google Play Services para los clientes de Android. Las instrucciones para esto están aquí:

https://developers.google.com/appengine/docs/java/endpoints/consume_android#Java_Making_authenticated_calls

Tenga en cuenta que mientras los documentos hacen hincapié en la autenticación de usuario, también admite la autenticación de aplicaciones.

Lo que no sé (pero me gustaría) es cómo hacer lo mismo para una aplicación que no sea de puntos finales, así que supongo que esto es sólo una respuesta parcial.

Respuesta breve es, no se puede, por lo menos no completamente seguro.

https://security.stackexchange.com/questions/826/how-can-i-securely-authenticate-the-client-application-sending-me-data

Respuesta larga es, puede hacer que sea difícil para los hackers. Por lo general, esto funciona mediante la incrustación de una clave en la aplicación, ocultándolo, y ofuscando el código para obtener la clave. Esto no hace imposible que alguien encuentre la llave, simplemente más difícil.

Uno de los sistemas de consumo más fuertes por ahí es el Silverlight DRM de Microsoft, es posible que desee investigar cómo funciona: http://www.iis.net/learn/media/iis-media-services/content-protection-in-silverlight

Puede hacer que todos sus servicios REST requieran una clave de acceso y un secreto cuando se accede. La aplicación podría almacenarlos en la configuración y quedar en blanco cuando se envíe a la tienda de aplicaciones.

Luego, cuando descargue la aplicación, puede entrar en los ajustes de configuración e insertar la clave y el secreto que ha configurado para su servicio REST. (De esta forma se evita que cualquier persona acceda a los servicios, ya que agrega manualmente la clave + secreto que se utilizan)

Yo recomendaría configurar un registro IP de todos los intentos de acceso no autorizado en el servidor para que pueda crear una lista negra si alguien está enviando spam a su servicio web con intentos de acceso no válido.

Y entonces para colmo todo usted podría hacer esto todo sobre HTTPS.

Hay pocas opciones:

  • En primer lugar se puede limitar por IP. Esta no es una buena manera si su aplicación Android obtiene IP dinámica cada vez.
  • En segundo lugar usted puede utilizar algorigthm en el servidor y el cliente que sólo usted conocido. El servidor podría enviar los datos al cliente, el cliente ejecuta ese algoritmo y modificar los datos. A continuación, envía de nuevo al servidor. El servidor también ejecuta ese algoritmo y comprueba la respuesta. Si la respuesta es igual a lo que el servidor ha calculado, el servidor sabe que el cliente está autorizado. En ese caso, los datos iniciales que envían desde el servidor deben ser diferentes cada vez.
  • En tercer lugar, puede utilizar algunas funciones de hash públicamente disponibles en lugar de su propio algoritmo. La idea es la misma. El servidor utiliza la misma función de hashing y comprueba si la respuesta del cliente es idéntica a su cálculo.

La forma canónica de hacerlo es usar SSL y certificados de cliente. No estoy seguro de si App Engine admite esto.

Tenga en cuenta, sin embargo, que si está distribuyendo su APK, entonces no puede confiar únicamente en algo distribuido con el APK – sería posible (si es bastante improbable, dependiendo de lo alto que sea su objetivo) Para extraer la información necesaria para falsificar la aplicación.

  • Uid ... no tiene android.permission.UPDATE_APP_OPS_STATS
  • ¿Puede mi aplicación Android imitar el intento del sistema?
  • SecurityException: No se puede iniciar el servicio Intención {act = com.google.android.c2dm.intent.REGISTER pkg = com.google.android.gms (tiene extras)}
  • Seguridad de activos en Android
  • El juego de Android sigue siendo hackeado
  • Verificar que Android apk no ha sido reempaquetado?
  • Cómo acceder a Elemento seguro sin enraizar un dispositivo que ya admite SmartCard API
  • Android donde guardar datos personales?
  • Hacer una aplicación de Android que no se puede desinstalar / eliminar
  • Android - después de cargar URL con webview puedo cambiar el color de fondo
  • ¿Debemos usar el proveedor de seguridad de google con OkHttp?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.