Explicación detallada del principio del mecanismo de firma APK
Como todos sabemos, durante el proceso de instalación de Apk, el sistema Android realizará la verificación de firma en el Apk. Solo después de que pase la verificación la instalación será exitosa. Entonces, ¿sabes cuál es el mecanismo de verificación de firma? ¿Cuál es el contenido específico que se está verificando? ¿Cuál es el valor SAH1 que se completa al solicitar un SDK de terceros (como WeChat Pay)? ¿Cómo evitan las numerosas soluciones actuales de envasado rápido por lotes la verificación de firmas?
Resolveré estas dudas a través de una serie de artículos:
Este artículo presenta primero los conocimientos básicos relacionados con la firma Apk.
Para saber qué es una firma, veamos primero por qué es necesaria. Como todos sabemos, al comunicar mensajes se deben resolver al menos dos problemas: uno es garantizar la autenticidad de la fuente del mensaje y el otro es garantizar que el mensaje no sea manipulado por un tercero. Al instalar una Apk, también debe garantizar la autenticidad de la fuente de la Apk y que la Apk no haya sido manipulada por un tercero. ¿Cómo solucionar estos dos problemas? El método consiste en que el desarrollador firme el Apk: escriba una "huella digital" en el Apk. Después de escribir la huella digital, cualquier modificación en el Apk hará que la huella digital no sea válida. El sistema Android no pasará la verificación de la firma al instalar el Apk, lo que garantiza la seguridad.
Para entender cómo implementar una firma, es necesario comprender dos conceptos básicos: resúmenes digitales y certificados digitales.
En pocas palabras, después de calcular datos de cualquier longitud mediante un algoritmo Hash, se pueden obtener datos binarios de longitud fija. Estos datos se denominan "resumen". El resumen tiene las siguientes características:
Como se mencionó anteriormente, las firmas se pueden utilizar para garantizar la confiabilidad de la fuente de datos y la no manipulabilidad de los datos. La firma se cifra sobre la base del resumen. Los datos cifrados del resumen se pueden utilizar como firma digital. Al instalar el Apk, es necesario verificar la firma. Si se pasa la verificación, la instalación puede continuar.
Aquí hay dos procesos: el proceso de firma y el proceso de verificación.
Hablemos primero del proceso de firma:
Veamos el proceso de verificación:
Aquí hay una premisa: el receptor debe conocer la clave pública del remitente. y todo el algoritmo utilizado. Si se manipulan la firma digital y la clave pública, el destinatario no puede saberlo y la verificación se realizará de todos modos. ¿Cómo garantizar la confiabilidad de la clave pública? La respuesta es un certificado digital El certificado digital es emitido por la Autoridad de certificación y contiene la siguiente información:
Después de recibir el mensaje, el destinatario primero verifica la legitimidad del certificado con la CA (según el firma del certificado, nombre de dominio vinculado y otra información (la organización de CA tiene autoridad y puede garantizar la confiabilidad de este proceso) y luego realizar la verificación de la firma.
Cabe destacar que los certificados Apk suelen ser autofirmados, es decir, los elabora el propio desarrollador y no se aplican a la organización CA. Cuando Android instala el Apk, no verifica la legitimidad del certificado en sí. Solo extrae la clave pública y el algoritmo de cifrado del certificado. Es por eso que después de volver a firmar el Apk de terceros, puede continuar operando en los sistemas. que no tienen el Apk instalado Motivo de instalación.
Cuando firmamos el Apk, no especificamos directamente la clave privada, la clave pública y el certificado digital, sino que utilizamos el archivo del almacén de claves. Esta información se incluye en el archivo del almacén de claves. Hay muchos tipos de archivos de almacén de claves basados en diferentes codificaciones. Android utiliza el formato de almacén de claves estándar de Java JKS (Java Key Storage), por lo que el archivo de almacén de claves exportado a través de Android Studio termina en .jks.
El estándar de certificado utilizado por el almacén de claves es X.509. El estándar X.509 también tiene múltiples formatos de codificación. Hay dos que se usan comúnmente: pem (Privacy Enhanced Mail) y der (Reglas de codificación distinguidas).
jks usa el formato der y Android también admite el uso directo de certificados en formato pem para firmar, que presentaremos a continuación.
La diferencia entre los dos formatos de codificación de certificados:
Formato de certificado X.509:
Android proporciona dos métodos para la firma Apk métodos, uno se basa en JAR y el otro en Apk. La principal diferencia entre ellos es que los archivos de firma utilizados son diferentes: jarsigner usa archivos de almacén de claves para firmar; apksigner admite el uso de archivos de almacén de claves para firmar. Archivo de certificado pem y clave privada para firmar.
No sé si has notado algún problema. Cuando generamos un almacén de claves a través de keytool o AS (firma tu aplicación), además de la contraseña del almacén de claves, también necesitas ingresar un alias y una clave. contraseña. . Al firmar, además de especificar el archivo del almacén de claves y la contraseña, también debe especificar la contraseña del alias y la clave.
La razón es que el almacén de claves es un almacén de claves, lo que significa que puede almacenar múltiples pares de claves y certificados. La contraseña del almacén de claves se utiliza para proteger el almacén de claves en sí. a través de alias diferenciados. Se puede ver desde aquí que jarsigner admite el uso de múltiples certificados para firmar Apk. apksigner también es compatible. Para obtener una introducción al uso de apksigner, consulte el documento oficial apksigner.
Ok, aquí se presentan el concepto básico de firma y proceso de verificación. Para obtener una introducción detallada de la firma JAR y el mecanismo de firma V2, consulte los dos artículos siguientes: