UMI

Uno de los puntos fuertes de Android, y que seguramente ha contribuido a su popularización, es que cualquier usuario puede, aunque no disponga de conocimientos informáticos, extraer los archivos de una aplicación y modificarla en su práctica totalidad sin tocar una sola línea del código de la misma, lo que es posible porque, como os hemos explicado en varias ocasiones, un APK no es más que un fichero comprimido en formato ZIP.

No obstante, y dado que Google, por seguridad, verifica la firma de las aplicaciones en cada inicio, cuando se modifica una aplicación es necesario volver a firmarla para que pueda ser instalada y utilizada lo que, obviamente, se realizará con un certificado distinto al utilizado por el desarrollador de la misma.

En general, los desarrolladores no suelen poner dificultades a los usuarios que desean modificar sus aplicaciones, existiendo algunas versiones custom que son casi tan populares como la aplicación original, si bien hay que ser precavido y controlar este tema si nuestras aplicaciones hacen uso de las compras In-App, ya que este tipo de compras no funcionan en aplicaciones refirmadas.

Banner sobre Android

Para ello lo más sencillo es obtener el hash del certificado con el que proceder a la firma de una aplicación, que podemos obtener de varias maneras, aunque quizás lo más sencillo es firmar la aplicación y añadir una línea que lo muestre, bien sea por pantalla o en el syslog.

int signature_hash = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES).signatures[0]

Una vez conocido el hash correspondiente a nuestro certificado, que será el mismo para todas nuestras aplicaciones (siempre y cuando usemos el mismo certificado), deberemos hacer una simple comprobación al inicio de la misma, tal como indicamos a continuación.

private static final int VALID_SIGNATURE = 90934282;

private boolean isApplicationResigned()
{
boolean valid_signature = false;
Signature[] signatures = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES).signatures;
valid_signature = (signatures[0] == VALID_SIGNATURE);
return ! valid_signature;
}




Ingeniero en Informática por la Universidad Politécnica de Cataluña. Programador en perl, php, c++, Java,... Desarrollador reconocido del foro XDA-Developers. Usuario Android desde 2009, y actualmente también desarrollador de utilidades y ROMs para ese sistema. Mi primer smartphone fue un Qtek-S100, en 2005, y desde entonces ando buscando el dispositivo perfecto. Si no fuera por la crisis cambiaría de móvil varias veces al día :)

1 comentario

  1. Hola!

    Respecte aquest post, sabries si és possible que programant una aplicació en Android es pogués comprobar un certificat (instal·lant prèviament el certificat) per autentificar a la persona?

    És a dir, per exemple que al entrar a l’aplicació es verifiqués el certificat per saber que la persona que ha entrat amb aquell dispositiu és X.

    Merci!

Deja una respuesta