Android – Aplicaciones instaladas – comprobación de integridad

  1. Si alguien manipula una aplicación androide instalada (archivo apk), ¿hay alguna comprobación realizada en el momento del lanzamiento para garantizar que la integridad de una aplicación no se vea comprometida? Como yo entiendo que no hay cheques realizados en el momento del lanzamiento y estoy tratando de hacer lo siguiente:
  2. Estoy tratando de calcular SHA-1 digiere de las aplicaciones instaladas (apk archivo). Soy consciente de que un archivo apk es como un archivo zip. Consta de otros archivos. Sin embargo, lo estoy tratando como cualquier otro archivo (sólo un flujo de bytes) y tratando de calcular SHA-1 digiere de todos los archivos apk. ¿Hay algún problema con este enfoque? El siguiente código siguió dando null exception:

Byte estático privado [] getSHA1FromFileContent (String filename) {

try { MessageDigest digest = MessageDigest.getInstance("SHA-1"); //byte[] buffer = new byte[65536]; //created at start. final FileInputStream fis = new FileInputStream(filename); int n = 0; byte[] buffer = null; while (n != -1) { n = fis.read(buffer); if (n > 0) { digest.update(buffer, 0, n); } } byte[] digestResult = digest.digest(); return digestResult; } catch (Exception e) { return null; } 

}

Como alternativa, cuando intenté recuperar los archivos del archivo apk y guardar los archivos individuales de la siguiente manera, volví a guardar la excepción null

 public void unzip() { try { FileInputStream fin = new FileInputStream(_zipFile); ZipInputStream zin = new ZipInputStream(fin); ZipEntry ze = null; while ((ze = zin.getNextEntry()) != null) { Log.v("Decompress", "Unzipping " + ze.getName()); if(ze.isDirectory()) { _dirChecker(ze.getName()); } else { File dstfile = new File(_location + ze.getName()); dstfile.createNewFile(); FileOutputStream fout = new FileOutputStream(dstfile.getPath()); //OutputStream out = openFileOutput(_location + ze.getName(), Context.MODE_PRIVATE); for (int c = zin.read(); c != -1; c = zin.read()) { fout.write(c); } zin.closeEntry(); fout.close(); } } zin.close(); } catch(Exception e) { Log.e("Decompress", "unzip", e); } } 
  1. También estoy verificando la configuración de la aplicación a través de – PreferencesManager.getDefaultSharedPreferences llamada que proporciona el nombre del paquete de la aplicación como parámetro de entrada
  2. Con el fin de verificar la integridad de una aplicación instalada es el cheque anterior suficiente?

Si alguien manipula una aplicación androide instalada (archivo apk), ¿hay alguna comprobación realizada en el momento del lanzamiento para garantizar que la integridad de una aplicación no se vea comprometida?

No existe tal concepto como "comprometido" desde el punto de vista del sistema operativo, aparte de tener una firma digital no válida. Si alguien tete con tu aplicación y lo firma, eso es indistinguible del sistema operativo de tu aplicación original, o de la aplicación después de que Amazon la "altere" con ella para su tienda, etc.

¿Hay algún problema con este enfoque? El código siguiente seguía dando excepción null

Primero, está manejando excepciones y no realiza registros. Encontrará que la depuración es mucho más simple cuando registra sus excepciones. A continuación, puede utilizar el seguimiento de la pila (por ejemplo, desde DDMS) para encontrar la línea en la que se está estrellando y corregir el error, sea lo que sea. Si desea ayuda con eso, deberá incluir en su pregunta detalles sobre dónde se está produciendo NullPointerException .

En segundo lugar, quien manipule con su aplicación simplemente eliminará todo este código, si puede encontrarlo.

En tercer lugar, puede ser bastante lento, por lo que es más fácil para ellos para encontrarlo.

También estoy verificando la configuración de la aplicación a través de – PreferencesManager.getDefaultSharedPreferences llamada que proporciona el nombre del paquete de la aplicación como parámetro de entrada

No tengo ni idea de por qué piensas que esto será una forma de verificación.

Con el fin de verificar la integridad de una aplicación instalada es el cheque anterior suficiente?

IMHO, el cheque anterior es en gran medida inútil. Si obfusca su código (por ejemplo, con ProGuard), llámelo desde varios lugares y use las otras técnicas descritas en esta entrada del blog , tal vez valga la pena, pero puede ser demasiado lento.

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