La firma de aplicaciones permite a los desarrolladores identificar al autor de la aplicación y actualizar su aplicación sin crear interfaces y permisos complicados. Toda aplicación que se ejecute 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 modificar, al dispositivo Android; y los desarrolladores pueden ser 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, Package Manager 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 aplicaciones 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 ayuda 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 aplicación.
Las aplicaciones también pueden declarar permisos de seguridad en el nivel de protección de firma, lo que restringe el acceso solo a las aplicaciones firmadas con la misma clave mientras se mantienen distintos UID y entornos limitados de aplicaciones. Se permite una relación más estrecha con un entorno limitado de aplicaciones compartido a través de la función de 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 lograr 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 posteriores instalan aplicaciones firmadas con esquemas v2+ más rápido que aquellos firmados solo con el 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. Se basa en JAR firmado . Para obtener detalles sobre el uso de este esquema, consulte la documentación de Android Studio sobre cómo 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, consumiendo más tiempo y memoria. Para abordar 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 versiones 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 procesa y se 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 firma en todo el archivo. Cualquier modificación del APK, incluidas las modificaciones de 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 archivo completo 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 los APK con sus firmas v1.
Para obtener detalles sobre el proceso de verificación de la firma de APK, consulte la sección Verificación de APK Signature Scheme v2.