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.

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.

  • Si utilizo SSLSocket en Android y código duro, la contraseña del truststore en el código fuente es insegura?
  • javax.net.ssl.SSLPeerUnverifiedException: Nombre de host no verificado:
  • Https conexión, las diferencias entre Android 2.3 y 4
  • no se puede conectar al servidor utilizando BKS keystore
  • Aplicación androide "Sin certificado par"
  • SSL SSLSockets con certificados autofirmados
  • SSLSocket se bloquea en getInputStream cuando el dispositivo android está en wifi
  • Cómo agregar un certificado pkcs12 de cliente a Postman Chrome, W7?
  • Certificado particular de confianza solamente emitido por CA - Android
  • Buscar en reaccionar no trabajará con ssl en android
  • Java - ignorar certificado SSL expirado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.