Cómo proteger la llamada a webservice en Android

Hola estoy trabajando en la aplicación Android en la que se requiere para ejecutar algunos servicios web https por lo que todos mi webservice URL y Web API KEY están en el código más la dirección IP del servidor. Cuando alguien hace la ingeniería inversa de mi aplicación, entonces ese chico puede obtener mi URL de servicio web, así como API KEY entonces simplemente puede golpearlo con el cliente de descanso.

Cómo asegurar de tal manera que cualquier atacante no puede obtener de todos modos mi WEB API KEY que he definido en strings.xml

 <string name="WEB_API_KEY">XXXXXXXXXXXXXXXXXXXXXXXXXXX</string> 

Gracias por adelantado.

5 Solutions collect form web for “Cómo proteger la llamada a webservice en Android”

He enfrentado el mismo problema. Primero para asegurar que esta es la aplicación que he creado está llamando al servicio web solamente. Incluso si obtienen la clave por la ingeniería reverencias. En segundo lugar, el usuario válido está llamando a la aplicación. Las siguientes comprobaciones se realizan en el servidor.

1) Compruebe que realmente está firmado por Google.

2) Compruebe que realmente es para usted.

Debe usar la consola de desarrolladores de Google https://console.developers.google.com/project?authuser=0 cree dos identificaciones de cliente (una para el servidor y otra para la aplicación android) en la API de menú y auth. Para crear un ID de cliente para la aplicación android, puede utilizar keytool keytool -exportcert -alias <your-key-name> -keystore <your-key-store-file> -v -list

He seguido los pasos desde aquí

Serverside php muestra se muestra a continuación

 function checkSession($token){ $result = Array(); if(isset($_SERVER['HTTPS'])) { if ($_SERVER["HTTPS"] == "on") { $secure_connection = true; } } if($secure_connection){ try { $client = new Google_Client(); $client->setClientId(CLIENT_ID); $client->setClientSecret(CLIENT_SECRET); $ticket = $client->verifyIdToken($token); $validtocken = false; if($ticket){ $token_data = $ticket->getAttributes(); if($token_data ["payload"]["aud"]==CLIENT_ID && $token_data ["payload"]["azp"]==ANDROID_ID){ $validtocken = true; $result["Email"]=$token_data ["payload"]["email"]; } else { log_message(serialize($token_data)); } } } catch (Exception $e) { $result["Details"]=$e->getMessage(); } } 

La mejor manera es recibir la clave api web del servidor en la primera aplicación de tiempo abierto .

En este caso la aplicación almacena la clave en el almacenamiento interno no en apk.

No puede confiar en algo codificado en su código para identificar si una solicitud proviene de su aplicación o de un cliente deshonrado. Lo que debe hacer es hacer que el servicio web requiera algún tipo de autenticación antes de aceptar cualquier solicitud. Un ejemplo sería requerir un par de nombre de usuario / contraseña o hacer que los servicios de webservice acepten / rechacen clientes basados ​​en su certificado SSL. De esta forma, sólo los usuarios autorizados utilizarían el servicio web.

Almacenar la API_KEY en la aplicación no es una buena idea, puede ser fácilmente ingeniería inversa, especialmente si se encontraba en los recursos XML. Tienes que ponerlo en el lado del servidor y luego hacer llamadas a los servicios.

App — Llame —> [Service1.php que tiene API_KEY] — Llame -> Servicio de pago.

App <— Response — [Service1.php] <— Respuesta —- Servicio de pago.

Es como tener capas de middleware entre el servicio de pago y su aplicación. Así el hacker no puede poner sus manos en la llave.

Asegurar una aplicación con sólo las credenciales codificadas en disco duro es ya mencionado ya no es seguro.

Debería sugerirle que use algún login como estructura. Donde primero pregunte por su nombre de usuario / contraseña.

A continuación, crear upp una llamada de API utilizando una firma que compila en tiempo de ejecución. Al hacer esto, nunca necesita enviar la contraseña de los usuarios a través de la web abierta.

Puede lograr esto haciendo una llamada como esta:

 APIkey = "a specicic APIkey"; //To identify the specifik app "not secret" Username = "usersname"; //To identify witch user trying to make the call Request = "you needed request data"; //Your actual requst parameters. Timestamp = "Current_timestamp"; //Current timestamp user to get unique signatures for every call Signature = sha256_hash(APIkey + Username + Request + Timestamp + Password); //Signature using the users password(Secret). 

A continuación, puede validar la llamada mediante la recompilación de la firma serverside aswell utilizando la contraseña almacenada en su base de datos. Si las firmas coinciden, la llamada debe ser auténtica. También debe establecer un límite de tiempo y denegar todas las llamadas que sean antiguas.

Nota: es probable que necesite adaptarse y cambiarlo a un código de trabajo en su idioma, pero obtendrá la idea.

  • ¿El Apache DefaultHttpClient (Android) y NSURLConnection (iOS) vuelven a intentar las conexiones fallidas con versiones de protocolo anteriores?
  • Error de protocolo desconocido con conexión HTTPS en android
  • Cómo crear un formato BKS (BouncyCastle) Java Keystore que contiene una cadena de certificados de cliente
  • ¿Cómo puedo hacer que Android Volley realice una solicitud HTTPS, utilizando un certificado autofirmado por una CA de Unkown?
  • HTTPS con Retrofit y OkHttp Handshake falló
  • OKhttp: SSLProtocolException: Protocolo de enlace SSL finalizado
  • ¿Cómo puedo establecer SignalR en Android Studio para ignorar los problemas de SSL para el desarrollo
  • HttpsUrlConnection con proxy
  • Android 2.3.4 problema de SSL
  • Error de libcurl CURLE_SSL_CACERT_BADFILE en android
  • ¿Cómo hacer un HTTPS POST de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.