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 app, excepto a través de un IPC bien definido.
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. Las apps no tienen que estar firmadas por una autoridad central. Actualmente, Android no realiza la verificación de 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 estrecha 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:
- Esquema v1: basado en la firma de JAR
- Esquema v2: Esquema de firma de APK v2, que se introdujo en Android 7.0.
- Esquema v3: Esquema de firma de APK v3, que se introdujo en Android 9.
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 versiones posteriores más rápido que aquellas firmadas solo con el esquema v1. Las plataformas de Android más antiguas 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 APKs ha sido parte de Android desde el principio. Se basa en un JAR firmado. Para obtener detalles sobre el uso de este esquema, consulta la documentación de Android Studio sobre cómo firmar tu app.
Las firmas de 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.
Esquemas 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). El contenido del APK se hash y se firma, 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 APK 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 APK también estén firmados con v1.
Figura 1: Proceso de verificación de la firma de APK
El hash del archivo completo del APK se verifica con 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 de v2 y versiones posteriores. 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 del APK, consulta la sección Verificación del Esquema de firma de APK v2.