2011-12-28 8 views
7

Recupero datos de un servidor externo para utilizarlos con mi aplicación de Android. Me gustaría que esta información solo fuera accesible con mi aplicación. Uso una conexión http estándar para obtener los datos del servidor apache/php en formato json. También envío algunos parámetros al servidor para recuperar datos relevantes. Ahora, lo que planeo hacer es:Compruebe si la solicitud http proviene de mi aplicación de Android

  1. Enviar los parametros
  2. enviar algo como MD5 ("someSecretPhrase" + parametros).
  3. Compruebe si la frase secreta es correcta en el lado del servidor.

Ahora, la pregunta es: ¿es un enfoque seguro con respecto a la ingeniería inversa? Por ahora no puedo pensar en otra posibilidad para obtener estos datos. Pero si alguien puede descompilar mi apk, también podrá recuperar esta "someSecretPhrase" (algo difícil de hacer en el lado del servidor) y luego acceder al servidor, ¿no? ¿Es una amenaza real? ¿Hay alguna otra posibilidad de autenticar mi aplicación por parte del servidor?

Miré los foros, por ejemplo. Identify whether HTTP requests from Android App or not? and then respond appropriately, pero no explican el problema de descompilación.

Respuesta

7

Una de las reglas básicas de seguridad es: no confías en los datos del cliente. Nunca.

Debe tener en cuenta su aplicación decompiled, todas las teclas "secretos" conocidos por atacante, etc.

Es posible, sin embargo, los intentos de obstaculizar atacante para forjar sus peticiones. Enviar (y verificar) la suma de comprobación de su solicitud es uno de los métodos (su idea es MD5(secret_key + params)).

También podría cambiar a un protocolo binario cifrado. Pero esto requiere MUCHO más trabajo y una arquitectura de servidor bastante diferente.

+0

Estoy empezando en un alojamiento compartido, por lo que la arquitectura diferente en el servidor probablemente no sea una opción para mí. Esta información no es tan vulnerable (no hay números de tarjetas de crédito de clientes), pero requerirá mucho trabajo reunirla (y se reunirá continuamente) por lo que sería realmente malo si alguien pudiera simplemente copiar mi idea y usar los datos. .. –

+1

Bueno, si su servidor responde con algunos datos, debería considerarlo público. Además de descompilar su aplicación y falsificar las solicitudes, él (atacante) podría simplemente usar un proxy y volcar los datos que envía a su aplicación legítima. –

+0

Entonces, si te entendí correctamente, la única opción para hacerlo de forma segura es utilizar una conexión encriptada entre el servidor y la aplicación. Https estaría bien? Entiendo que no es tan fácil de usar. Pero, ¿cuáles son otros inconvenientes? Es considerablemente más lento, ¿no? Estoy tratando de averiguar si la seguridad de esta información vale la pena el esfuerzo –

1

Desafortunadamente, si alguien descompila tu apk, entonces puede ver fácilmente tus cadenas.

EDIT: no creo que hay una mejor manera de hacer esto .. tal vez sólo para publicar la aplicación en el mercado androide con el androide de protección de copia activada ...

+0

Gracias por su pronta respuesta. La descompilación es un proceso bastante simple, supongo. Es decir, ¿no debería confiar en la suposición de que no se descompilará? Hmm, TIENE QUE haber alguna otra solución ... –

+1

Puedes autenticar usuarios, no puedes autenticar aplicaciones, puedes hacerlo más difícil, pero al final del día estás enviando el código y los secretos a los malos . – superfell

+0

Sí, probablemente lo superaré o invertiré en algún cifrado cuando los datos prueben su valor. Dicho esto, estoy bastante sorprendido de que sea tan difícil de lograr –

2

Haga que su aplicación realice un apretón de manos con el servidor, por lo que el algoritmo no es solo una cadena, sino un proceso completo. Uso Sesiones/bases de datos para realizar un seguimiento de su apretón de manos

+1

Y se realiza un apretón de manos sobre ssl, ¿no es así? Por lo tanto, sería más o menos lo mismo que mencionamos en los comentarios eralier (no signifique suma de comprobación aquí). Pero es bueno saber que esto se llama apretón de manos, ¡gracias! –

1

Puede ocultar sus enlaces establecidos por todos los enlaces URL y nombres Paramete en strings.xml por ejemplo: http://wwww.yourdomain.com/yourpage.any user_name y obtener enlace en:

String serverUrl = Resources.getsystem().getstring(R.strings.name_your_link_id); String parameterKey = Resources.getsystem().getstring(R.strings.name_your_parameter_id); Uri url = Uri.parse(serverUrl+"?"+parameterKey+"=" + yorusername);

y realizar cualquier solicitud HTTP HttpURLConnection con = (HttpURLConnection) url.openConnection();

cuando cualquiera intente descompilada su aplicación se mostrará solamente Identificación como entero largo en el archivo R.java obtener el código como este String serverUrl = Resources.getsystem().getstring(12346546564); String parameterKey = Resources.getsystem().getstring(123321321132);

+1

Pero creo que solo lo haría un poco más engorroso, no imposible de conseguir. Los recursos de cadena están dentro de resources.arsc cuando descomprime un archivo * .apk. Entonces todavía están asociados con esos números. Pero +1 para una idea interesante –

1

Android requiere que uno debe sign su aplicación (la firma de la autoridad o auto firmado) antes de que pueda ser instalado. Podemos utilizar esto para verificar si las solicitudes provienen de su aplicación o no.

  1. Registre su aplicación con su certificado.
  2. Find firma de los certificados y guárdelo en su servidor back-end.
  3. Para cada solicitud, esperamos que esta firma sea enviada por la aplicación.
  4. validar la firma enviada por la aplicación a nivel de servidor y aceptar solo si coinciden.

Incluso en el caso en que alguien altere su aplicación, tiene que volver a firmar antes de instalarla, lo que cambiaría la firma de la aplicación y nuestro mecanismo de validación rechazaría simplemente todas las solicitudes.

Esta respuesta se basa en el blog this. Use https para la aplicación < -> comunicación del servidor.

+1

Pero cualquiera puede usar el código de firma para encontrar el hash de su aplicación usando el nombre del paquete de su aplicación y puede comenzar a enviar ese hash en futuras solicitudes. Entonces, ¿cómo esta firma está asegurando la aplicación? –

+0

¿Cómo hacer el paso 3, es el comportamiento predeterminado del sistema operativo Android? –

Cuestiones relacionadas