Firma de apps

La firma de apps permite a los desarrolladores identificar al autor de la app y actualizarla sin crear interfaces ni permisos complicados. Cada app que se ejecuta en la plataforma de Android debe estar firmada por el desarrollador. Google Play o el instalador de paquetes del dispositivo Android rechazan las apps que intentan instalarse sin firmar.

En Google Play, la firma de apps une la confianza que Google tiene en el desarrollador y la confianza que el desarrollador tiene en su app. Los desarrolladores saben que su app se proporciona sin modificaciones al dispositivo Android y que pueden ser responsables del comportamiento de su app.

En Android, la firma de apps es el primer paso para colocar una app en su zona de pruebas. El certificado de app firmado define qué ID de usuario está asociado con qué app. Las diferentes apps se ejecutan con diferentes IDs de usuario. La firma de apps garantiza que una app no pueda acceder a ninguna otra, excepto a través de una IPC bien definida.

Cuando se instala una app (archivo APK) en un dispositivo Android, el Administrador de paquetes verifica que el APK se haya firmado correctamente con el certificado incluido en él. Si el certificado (o, más precisamente, la clave pública en el certificado) coincide con la clave que se usa para firmar cualquier otro APK en el dispositivo, el APK nuevo tiene la opción de especificar en el manifiesto que comparte un UID con los otros APK firmados de manera similar.

Las apps pueden estar firmadas por un tercero (OEM, operador o mercado alternativo) o autofirmadas. Android proporciona la firma de código con certificados autofirmados que los desarrolladores pueden generar sin asistencia ni permiso externos. No es necesario que las apps estén firmadas por una autoridad central. Actualmente, Android no realiza la verificación de la AC para los certificados de apps.

Las apps también pueden declarar permisos de seguridad a nivel de la protección de la firma, lo que restringe el acceso solo a las apps firmadas con la misma clave y, al mismo tiempo, mantiene UIDs y zonas de pruebas de aplicaciones distintas. Se permite una relación más cercana con una zona de pruebas de aplicaciones compartida mediante la función de UID compartido, en la que dos o más apps firmadas con la misma clave de desarrollador pueden declarar un UID compartido en su manifiesto.

Esquemas de firma de APK

Android admite tres esquemas de firma de apps:

Para lograr la máxima compatibilidad, firma las apps con todos los esquemas, primero con la v1, luego con la v2 y, por último, con la v3. Los dispositivos con Android 7.0 y versiones posteriores instalan apps firmadas con esquemas v2 y posteriores más rápido que las firmadas solo con el esquema v1. Las plataformas de Android anteriores ignoran las firmas de v2 y versiones posteriores, por lo que las apps deben contener firmas de v1.

Firma JAR (esquema v1)

La firma de APK forma parte de Android desde el principio. Se basa en el JAR firmado. Para obtener información detallada sobre el uso de este esquema, consulta la documentación de Android Studio sobre la firma de tu app.

Las firmas v1 no protegen algunas partes del APK, como los metadatos ZIP. El verificador de APK debe procesar muchas estructuras de datos no confiables (aún no verificadas) y, luego, descartar los datos que no están cubiertos por las firmas. Esto ofrece una superficie de ataque considerable. Además, el verificador de APK debe descomprimir todas las entradas comprimidas, lo que consume más tiempo y memoria. Para abordar estos problemas, Android 7.0 introdujo el esquema de firma de APK v2.

Esquema de firma de APK v2 y v3 (esquema v2+)

Los dispositivos que ejecutan Android 7.0 y versiones posteriores admiten el esquema de firma de APK v2 (esquema v2) y versiones posteriores. (el esquema v2 se actualizó a v3 en Android 9 para incluir información adicional en el bloque de firma, pero funciona de la misma manera). Se genera un hash y se firma el contenido del APK, y luego se inserta el bloque de firma de APK resultante en el APK. Para obtener detalles sobre cómo aplicar el esquema v2 o versiones posteriores a una app, consulta Esquema de firma de APK v2.

Durante la validación, el esquema v2 y versiones posteriores trata el archivo APK como un BLOB y realiza la verificación de la firma en todo el archivo. Cualquier modificación en el APK, incluidas las modificaciones de metadatos de ZIP, invalida la firma del APK. Esta forma de verificación de APK es mucho más rápida y permite detectar más clases de modificaciones no autorizadas.

El nuevo formato es retrocompatible, por lo que los APKs firmados con el nuevo formato de firma se pueden instalar en dispositivos Android más antiguos (que simplemente ignoran los datos adicionales agregados al APK), siempre y cuando estos APKs también estén firmados con v1.

Proceso de verificación de la firma de APK

Figura 1: Proceso de verificación de la firma de APK

El hash de todo el archivo del APK se verifica en función de la firma de v2 o versiones posteriores almacenada en el bloque de firma del APK. El hash abarca todo, excepto el bloque de firma de APK, que contiene la firma v2+. Cualquier modificación al APK fuera del bloque de firma del APK invalida la firma v2+ del APK. Los APKs con firma v2 o posterior despojada también se rechazan, ya que su firma v1 especifica que el APK se firmó con v2, lo que hace que Android 7.0 y versiones posteriores se nieguen a verificar los APKs con sus firmas v1.

Para obtener detalles sobre el proceso de verificación de la firma de APK, consulta la sección Verificación del Esquema de firma de APK v2.