¿Qué tan seguro es GoogleAuthUtils.getToken () si la aplicación se descompila

Actualmente estoy creando una aplicación para Android que solicita datos de mi servidor backend. Por supuesto, quiero saber si una solicitud recibida en mi servidor realmente viene de mi aplicación o si alguien acaba de enviar solicitudes HTTP de otro servidor, etc Leí el artículo de Tim Bray sobre ese tema, pero quiero saber cómo este enfoque es realmente seguro . El artículo menciona que un dispositivo enraizado podría comprometer la seguridad, pero estaba pensando en el siguiente escenario:

  • Una persona maliciosa toma mi aplicación, la descompila completamente y detecta que uso GoogleAuthUtils
  • Cambia mi aplicación para hackearla y desplegarla en su dispositivo (usando el mismo nombre de paquete, etc.)

Sé que la firma de la aplicación falsa será diferente (ya que la persona malintencionada no tiene mi clave privada) y que no se puede descargar desde Play Store (porque no se pueden publicar allí dos aplicaciones con los mismos nombres de paquete).

Siempre que el dispositivo no esté enraizado: ¿esta aplicación falsa recibe el mismo resultado (o alguno) de GoogleAuthUtils.getToken() como mi aplicación real?

¿Cuáles son los posibles cambios que el hacker podría aplicar a la respuesta en un dispositivo con raíz? (También podría preguntar: ¿qué campos de la respuesta están firmados por Google para poder detectar si están desprotegidos)?

No he testet que … pero yo diría que getToken no obtendría ningún resultado debido a la firma equivocada …

No puede crear un cliente oauth en la consola de desarrolladores de google sin la huella digital del certificado utilizado para firmar la aplicación en combinación con el paquete.

Thats porqué yo diría que getToken no recibe ninguna crítica si la persona malévola no tiene su keystore de la liberación y llave privada

Editar: PS: Sé … esto sólo responde a una de sus preguntas …

Edit2: lo he probado y podría obtener un token válido con una firma incorrecta. Si un cambio de la firma que tengo la siguiente excepción:

 03-17 18:08:05.195 3315-3498/org.example.myapp E/GoogleOAuthTask: Error getting token com.google.android.gms.auth.UserRecoverableAuthException: NeedPermission at com.google.android.gms.auth.GoogleAuthUtil$1.zzam(Unknown Source) at com.google.android.gms.auth.GoogleAuthUtil$1.zzan(Unknown Source) at com.google.android.gms.auth.GoogleAuthUtil.zza(Unknown Source) at com.google.android.gms.auth.GoogleAuthUtil.zza(Unknown Source) at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) at org.example.myapp.shared.security.authentication.google.GoogleOAuthTask.doInBackground(GoogleOAuthTask.java:39) at org.example.myapp.shared.security.authentication.google.GoogleOAuthTask.doInBackground(GoogleOAuthTask.java:20) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841) 

Entonces hice algo como esto para conseguir el diálogo del permiso:

 try { token = GoogleAuthUtil.getToken(context, emails[0], "oauth2:profile email"); GoogleAuthUtil.clearToken(context, token); } catch (final UserRecoverableAuthException e) { final Intent intent = e.getIntent(); context.startActivityForResult(intent, MyApplicationRequestCodes.SECURITY_OAUTH_PERMISSION); } catch (final GoogleAuthException e) { Log.e(LOG_TAG, "Error getting token", e); } catch (final IOException e) { Log.e(LOG_TAG, "Error getting token", e); } 

Después del diálogo cuando vuelve en la actividad he hecho esto:

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(LOG_TAG, "returning from an activity. (requestCode=" + requestCode + ", resultCode=" + resultCode + ", data=" + data.toString() + ")"); if(requestCode == SECURITY_OAUTH_PERMISSION && resultCode == RESULT_OK) { login(); } if(requestCode == SECURITY_OAUTH_PERMISSION && resultCode == RESULT_CANCELED) { authenticationHandler.onUserCanceled(new AuthenticationError( AuthenticationErrorEnum.USER_ERROR, "User closed permission dialog." )); } 

El inicio de sesión () inicia de nuevo el mismo procedimiento y, a continuación, recibí un token válido y pude autenticar otra API protegida por token de google. En mi ejemplo era un firebase DB.

De firebase conseguí el resultado de la autentificación (el):

 AuthData{uid='google:123412341234333', provider='google', token='***', expires='1458340206', auth='{uid=google: 123412341234333, provider=google}', providerData='{id=987234987032972034097234, accessToken=I_REMOVED_THE_TOKEN_STRING, displayName=Stefan Heimberg, email=kontakt@stefanheimberg.ch, cachedUserProfile={id= 987234987032972034097234, email=kontakt@stefanheimberg.ch, verified_email=true, name=Stefan Heimberg, given_name=Stefan, family_name=Heimberg, picture=https://lh4.googleusercontent.com/--XEA5G7LkjI/AAAAAAAAAAI/AAAAAAAAAAs/dpvdzBNpd6U/photo.jpg, locale=de}, profileImageURL=https://lh4.googleusercontent.com/--XEA5G7LkjI/AAAAAAAAAAI/AAAAAAAAAAs/dpvdzBNpd6U/photo.jpg}'} 

Por lo tanto, finalmente Debo decir que es posible obtener un token válido, incluso cuando la firma no es la misma que la configurada en la consola de google.

Pero después de cambiar la firma, mi aplicación debe manejar la com.google.android.gms.auth.UserRecoverableAuthException y reinicia todo el procedimiento de inicio de sesión.

  • Google Play Services 9.2.0 clases perdidas
  • ¿Es posible obtener el anuncio de publicidad de Android sin agregar servicios de juegos dependencia de anuncios?
  • API de datos de Youtube con OAuth2.0 en Android
  • Android: ¿Cómo obtener un token de actualización mediante Google Sign-In API?
  • Error: el paquete com.google.android.gcm no existe - Después de migrar a Gradle
  • Se pierde memoria con GoogleApiClient detectado por Android Studio
  • Error de ejecución para la tarea ': app: processReleaseGoogleServices'. > Ningún cliente coincidente encontrado para el nombre del paquete
  • Error 12501 de autenticación con inicio de sesión de Google
  • ¿Funcionará GCM Network Manager en dispositivos que no sean de Play?
  • Uso de Proguard para eliminar clases no utilizadas en la biblioteca de Servicios de Google Play
  • Falta clave api_key / actual con los Servicios de Google 3.0.0 y clave de API de Google Maps en build.gradle
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.