Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Protege el acceso a la URL de la API mediante hash en la aplicación para Android

En mi aplicación de Android, el usuario puede enviar contenido a la base de datos que también puede ser visto por todos los demás usuarios también.

Este nuevo contenido se envía al servidor a través de la solicitud GET:

http://www.example.org/API.php?newContent=helloWorld 

El problema es: si un usuario descubre qué aspecto tiene esta URL, fácilmente podría enviar solicitudes maliciosas en su navegador y eludir la aplicación de Android. Tal vez uno podría descompilar la aplicación y averiguar sobre la URL.

¿Cómo puedo proteger el acceso a esta URL y evitar que los usuarios accedan directamente a esta API?

¿Es una buena solución para generar un hash en la aplicación y compararlo con un hash generado en el archivo API.php en el servidor?

¿No se pudo averiguar cómo se genera el hash al descompilar la aplicación?

¡Muchas gracias por adelantado!

  • Cómo proteger los datos de intención mientras lo envía a través de aplicaciones
  • Aplicación NDK Firma de cheque
  • Características de seguridad en Android
  • Cómo cifrar y descifrar archivos en Android?
  • Seguridad de enviar extras de intenciones sensibles dentro de mi propia aplicación?
  • ¿Cómo ahorrar mejor el estado de compra de InApp localmente?
  • ¿Dónde almacenar datos de aplicaciones grandes en dispositivos android?
  • Asegurar un servicio web para que sólo pueda ser llamado por una aplicación específica de Android
  • 4 Solutions collect form web for “Protege el acceso a la URL de la API mediante hash en la aplicación para Android”

    Por lo tanto, la única manera de proteger verdaderamente esa dirección URL es exigir que todas las solicitudes sean autenticadas.

    Una manera de hacer esto es cambiar su solicitud a una solicitud POST y enviar a lo largo de algún tipo de token de autenticación (un simple hash hará) con la solicitud. Si el token de autenticación no está presente, simplemente no responda a la solicitud. El hash sería algo que se hardcode tanto en el cliente y el servidor.

    Ahora la pregunta es cómo ocultar su token de autenticación. Siempre y cuando no esté abierto el código de su código, la única manera de que alguien llegue a ella sería descompilar su programa como usted ha mencionado. Para protegerse contra esto, es posible que desee examinar el uso de proguard (http://developer.android.com/guide/developing/tools/proguard.html).

    Algo a tener en cuenta es que este método contiene un solo punto de fracaso. Si su token de autenticación está expuesto, está hecho para (por ejemplo, la debacle de la clave criptográfica HD DVD AACS).

    Otra forma de autenticar es por usuario. Mientras un usuario válido esté haciendo una solicitud, no debería importarle si la solicitud procede del navegador web o de la aplicación android. Creo que esta es una forma mucho mejor de hacer las cosas. Al hacer esto, puede acelerar las solicitudes por usuario. Esto sin embargo requiere que usted administre los perfiles del usuario y la lata entera del gusano que viene junto con ella.

    Todo lo dicho, al final del día, aunque no debería importarle si alguien conoce la url a una parte de su API. No conozco tu caso de uso particular, pero debe haber una forma de diseñar tu API para que no te importe cómo obtienes tus solicitudes. Además, si estás haciendo un GET verdadero, entonces no deberías estar cambiando nada en el servidor. Esto significa que toda la 'persona malintencionada' puede hacer es obtener datos fuera de ella. Esto limita severamente el daño que pueden hacer. De hecho, a menos que tenga datos sensibles que no desea que ciertas personas miren, realmente no tiene ningún problema en absoluto. Si lo hace, entonces usted realmente debe pensar en mi solución de autenticación por usuario.

    No confíe en el cliente para su validación. Esto es cierto si su javascript en un navegador web o incluso alguna plataforma bloqueada como el Iphone.

    Si la aplicación puede hacer las llamadas de la API, entonces claramente todo lo necesario para hacer esas llamadas está en el teléfono (secreto, función de hash, clave de la API, lo que sea), entonces alguien siempre puede volcar el almacenamiento de teléfonos y obtener todos esos datos. A continuación, pueden hacer cualquier solicitud que deseen.

    Lo que desea hacer es autenticar al usuario y luego validar la entrada en el lado del servidor.

    Utilice SSL (HTTPS) para sus transferencias de datos. El intercambio se cifra antes de que se envíe cualquier dato, por lo que cualquiera que esté escuchando no podrá ver ni la URL ni los datos enviados al servidor. Para verificar esto por usted mismo, instale Wireshark en su sistema de dev y cargue la URL en un navegador. No verá ningún dato en claro (ya sea la URL o los datos que se envían a través de GET o POST).

    Usted podría utilizar un método algo confuso de java para ofuscar cada letra de la URL. Por lo tanto, la creación de su propio diccionario de una manera que podría hacer que la URL posiblemente aparezca como 123.3 * 15 * 13 o algo así si alguien hizo descompilar el APK, no tendrían idea. Y en esa nota, idealmente usarías Proguard para ofuscarlo, así que tu ofuscación no tendría sentido para alguien que intenta hacer ingeniería inversa.

    Usted podría hacer un método java corto como este:

     public String confuseString() { Stringbuilder sb = new StringBuilder(); //your real URL would be abc.com, but in the app you have myURL = 123.3*15*13 //With what I'm saying the * would precede a 2 digit number that represents 1 letter for (int i = 0; i < stringLength; i++){ String letter = myURL.charAt(i); if (letter.equals("1"){ letter = a; sb.append(letter); } // you would go one to code each character into a letter } } 

    Habría varios más si las declaraciones, por supuesto, pero le permitiría ofuscar su url sin hacer ningún cambio en el lado del servidor. Y si usas Proguard, ese método entero que creas no tendría ningún sentido para alguien que intenta hacer ingeniería inversa.

    Por supuesto, podría hacer su ofuscación mucho más complicado de lo que he sugerido, pero es una idea de todos modos.

    Básicamente, estaría cifrando la URL de una manera muy confusa.

    He aquí una respuesta que puede ser un mejor método de encriptación o por lo menos dar cifrado adicional:

    Java – cifrar / descifrar el nombre de usuario y la contraseña de un archivo de configuración

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.