La firma de aplicaciones permite a los desarrolladores identificar al autor de la aplicación y actualizarla sin crear interfaces ni permisos complicados. Cada aplicación que se ejecuta en la plataforma Android debe estar firmada por el desarrollador . Las aplicaciones que intenten instalarse sin estar firmadas serán rechazadas por Google Play o por el instalador del paquete en el dispositivo Android.
En Google Play, la firma de aplicaciones une la confianza que Google tiene con el desarrollador y la confianza que el desarrollador tiene con su aplicación. Los desarrolladores saben que su aplicación se proporciona, sin modificaciones, al dispositivo Android; y los desarrolladores pueden ser considerados responsables del comportamiento de su aplicación.
En Android, la firma de aplicaciones es el primer paso para colocar una aplicación en su Application Sandbox. El certificado de aplicación firmado define qué ID de usuario está asociado con qué aplicación; diferentes aplicaciones se ejecutan con diferentes ID de usuario. La firma de aplicaciones garantiza que una aplicación no pueda acceder a ninguna otra aplicación excepto a través de un IPC bien definido.
Cuando se instala una aplicación (archivo APK) en un dispositivo Android, el Administrador de paquetes verifica que el APK se haya firmado correctamente con el certificado incluido en ese APK. Si el certificado (o, más exactamente, la clave pública en el certificado) coincide con la clave utilizada para firmar cualquier otro APK en el dispositivo, el nuevo APK tiene la opción de especificar en el manifiesto que compartirá un UID con el otro de manera similar. APK firmados.
Las solicitudes pueden estar firmadas por un tercero (OEM, operador, mercado alternativo) o autofirmadas. Android proporciona firma de código mediante certificados autofirmados que los desarrolladores pueden generar sin asistencia ni permiso externos. Las solicitudes no tienen que estar firmadas por una autoridad central. Actualmente, Android no realiza la verificación de CA para los certificados de aplicaciones.
Las aplicaciones también pueden declarar permisos de seguridad en el nivel de protección de Firma, restringiendo el acceso solo a aplicaciones firmadas con la misma clave mientras mantienen UID y entornos de pruebas de aplicaciones distintos. Se permite una relación más estrecha con una zona de pruebas de aplicaciones compartida mediante la función UID compartido , donde dos o más aplicaciones 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 aplicaciones:
- Esquema v1: basado en la firma JAR
- Esquema v2: APK Signature Scheme v2 , que se introdujo en Android 7.0.
- Esquema v3: APK Signature Scheme v3 , que se introdujo en Android 9.
Para obtener la máxima compatibilidad, firme aplicaciones con todos los esquemas, primero con v1, luego con v2 y luego con v3. Los dispositivos Android 7.0+ y más nuevos instalan aplicaciones firmadas con esquemas v2+ más rápidamente que aquellas firmadas solo con esquema v1. Las plataformas Android más antiguas ignoran las firmas v2+ y, por lo tanto, necesitan que las aplicaciones contengan firmas v1.
Firma JAR (esquema v1)
La firma de APK ha sido parte de Android desde el principio. Está basado en JAR firmado . Para obtener detalles sobre el uso de este esquema, consulte la documentación de Android Studio sobre Firmar su aplicación .
Las firmas v1 no protegen algunas partes del APK, como los metadatos ZIP. El verificador de APK necesita procesar muchas estructuras de datos que no son de confianza (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 solucionar estos problemas, Android 7.0 introdujo APK Signature Scheme v2.
Esquema de firma APK v2 y v3 (esquema v2+)
Los dispositivos que ejecutan Android 7.0 y versiones posteriores admiten el esquema de firma APK v2 (esquema v2) y posteriores. (El esquema v2 se actualizó a v3 en Android 9 para incluir información adicional en el bloque de firma, pero por lo demás funciona igual). El contenido del APK se codifica y firma, luego el bloque de firma de APK resultante se inserta en el APK. Para obtener detalles sobre cómo aplicar el esquema v2+ a una aplicación, consulte APK Signature Scheme v2 .
Durante la validación, el esquema v2+ trata el archivo APK como un blob y realiza una verificación de firmas en todo el archivo. Cualquier modificación del APK, incluidas las modificaciones de los metadatos ZIP, invalida la firma del APK. Esta forma de verificación de APK es sustancialmente más rápida y permite la detección de más clases de modificaciones no autorizadas.
El nuevo formato es compatible con versiones anteriores, 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 que estos APK también estén firmados con v1.
El hash de todo el archivo del APK se verifica con la firma v2+ almacenada en el bloque de firma de APK. El hash cubre todo excepto el bloque de firma de APK, que contiene la firma v2+. Cualquier modificación del APK fuera del bloque de firma de APK invalida la firma v2+ del APK. Los APK con firma v2+ eliminada también se rechazan, porque su firma v1 especifica que el APK estaba firmado con v2, lo que hace que Android 7.0 y versiones posteriores se nieguen a verificar APK usando sus firmas v1.
Para obtener detalles sobre el proceso de verificación de firma de APK, consulte la sección Verificación de APK Signature Scheme v2.