Un breve análisis de los principios de firma de Android V1 y V2
Para garantizar la seguridad del sistema y las aplicaciones, Android necesita verificar la integridad del paquete al instalar el APK. Al mismo tiempo, para escenarios de instalación superpuesta, también necesita verificar si el paquete está instalado. los antiguos y los nuevos coinciden. Ambos están garantizados a través del mecanismo de firma de Android. Este artículo analizará brevemente los principios de firma y verificación de Android en varias partes:
La firma es una combinación de. resumen y cifrado de clave asimétrica El producto, el resumen, es como la información de la huella digital del contenido. Una vez que se manipula el contenido, el resumen cambiará. La firma es el resultado del cifrado del resumen. quedará inválido. Lo mismo ocurre con las firmas de APK de Android. Si la firma de APK no coincide con el contenido, el sistema Android pensará que el contenido del APK ha sido manipulado y se negará a instalarlo para garantizar la seguridad del sistema. Actualmente, Android tiene tres firmas: V1, V2 (N) y V3 (P). Este artículo solo analiza los dos primeros tipos, V1 y V2, y no considera el secreto redondo de V3. Primero mire el estilo del paquete APK con solo la firma V1:
Luego mire el estilo del paquete APK con solo la firma V2:
Con firma V1 y V2:
Sí, se puede ver que si solo hay una firma V2, el contenido del paquete APK casi no cambiará y no habrá archivos nuevos en META_INF. Según la documentación oficial de Google: Al firmar usando. En el esquema de firma v2, se insertará una firma APK en el archivo APK. El fragmento que precede e inmediatamente sigue a la sección del directorio central del zip. Dentro del bloque de firma APK, la firma y la información de identidad del firmante se almacenarán en el bloque del esquema de firma APK v2, lo que garantiza que no se pueda modificar todo el archivo APK, como se muestra a continuación:
La firma V1 se pasa META-INF Los tres archivos aseguran la integridad de la firma y la información:
¿Cómo garantiza la firma V1 la integridad de la información? La firma V1 contiene principalmente tres partes. Si hablamos de firma y clave pública en un sentido estricto, solo en el archivo .rsa, los tres archivos de la firma V1 son en realidad un conjunto de mecanismos, y no se puede usar solo uno para hablar de ello.
Si se reemplaza el archivo de recursos en el APK, el resumen del recurso debe cambiar. Si la información en MANIFEST.MF no se modifica, la verificación V1 fallará durante la instalación y no se podrá instalar. , si el archivo es manipulado Al mismo tiempo, el valor de resumen en MANIFEST.MF también se modifica, por lo que se puede omitir la verificación de MANIFEST.MF.
Personalmente, CERT.SF se siente un poco como redundancia, más bien como una garantía secundaria de integridad del archivo. Al igual que omitir MANIFEST.MF, la verificación de .SF también se puede omitir fácilmente.
CERT.RSA y CERT.SF se corresponden entre sí. Los prefijos de nombre de los dos deben ser los mismos. No sé si este es un estándar aburrido.
Eche un vistazo al contenido del archivo CERT.RSA:
El archivo CERT.RSA almacena la clave pública del certificado, la fecha de vencimiento, el emisor, el algoritmo de cifrado y otra información basada en la clave pública y el algoritmo de cifrado. , el sistema Android puede calcular El formato estricto de la información resumida de CERT.SF es el siguiente:
Desde CERT.RSA, podemos obtener la información de huellas digitales del certificado, que a menudo se usa al compartir en WeChat y la solicitud de SDK de terceros De hecho, es una firma de la información del desarrollador de clave pública:
Excepto el archivo CERT.RSA, los otros dos archivos de firma en realidad no tienen nada que ver. almacén de claves. Son principalmente el resumen abstracto y secundario del archivo en sí, utilizando diferentes almacenes de claves, el MANIFEST.MF y CERT.SF generados son los mismos, la única diferencia es el archivo de firma CERT.RSA. En otras palabras, los dos primeros garantizan principalmente la integridad de cada archivo, y CERT.RSA garantiza el origen y la integridad del APK en su conjunto. Sin embargo, los archivos en META_INF no están incluidos en el rango de verificación, lo que también es una deficiencia. de V1. ¿Cómo garantiza la firma V2 la integridad de la información?
Como se mencionó anteriormente, la integridad de los archivos en la firma V1 se puede eludir fácilmente. Se puede entender que la importancia de la verificación de integridad de un solo archivo no requiere mucho tiempo. durante la instalación. Es mejor utilizar un método de verificación más simple. La firma V2 no verifica un solo archivo, pero verifica el APK, divide el APK en bloques de 1 millón, calcula un resumen de valor para cada bloque, luego resume todos los resúmenes y luego usa el resumen para la firma.
En otras palabras, la firma del resumen V2 se divide en dos niveles. El primer nivel es para resumir las partes 1, 3 y 4 del archivo APK. colección y luego use la clave secreta para firmar. Cuando se instalan, los resúmenes de bloques se pueden procesar en paralelo, lo que mejora la velocidad de verificación.
El APK se digiere primero y luego se firma. Veamos primero la definición de resumen: Resumen de mensajes: el resumen consiste en realizar un hash unidireccional en los datos del mensaje para generar un valor Hash de longitud fija. El valor es el resumen del mensaje, en cuanto a los comúnmente escuchados MD5 y SHA1, ambos son un tipo de algoritmo de resumen. En teoría, habrá colisiones en el resumen, pero siempre que la tasa de colisiones sea baja dentro de una longitud limitada, el resumen se puede utilizar para garantizar la integridad del mensaje. Siempre que el mensaje sea manipulado, el resumen definitivamente lo hará. cambiar. Sin embargo, si el mensaje y el resumen se modifican al mismo tiempo, no hay forma de saberlo.
¿Qué es una firma digital (firma digital de clave pública)? Utiliza tecnología de cifrado asimétrico para cifrar el resumen a través de la clave privada para generar una cadena. Este certificado de clave pública de cadena puede considerarse como un mensaje. Las firmas como RSA son algoritmos de cifrado asimétrico de uso común. En ausencia de una clave privada, el algoritmo de cifrado asimétrico puede garantizar que otros no puedan falsificar la firma. Por lo tanto, la firma digital también es una prueba eficaz de la autenticidad de la información del remitente. Sin embargo, dado que el certificado del almacén de claves de Android está autofirmado y no está certificado por una autoridad de terceros, los usuarios pueden generar su propio almacén de claves no puede garantizar que el APK no se vuelva a firmar.
Ahora que conocemos los conceptos de resumen y firma, veamos de dónde proviene el archivo de firma de Android. ¿Cómo afectar el paquete APK original? El comando para firmar un APK a través de apksign en el SDK es el siguiente:
Se implementa principalmente en la carpeta android/platform/tools/apksig. El cuerpo principal es la función de firma de ApkSigner.java. La función es relativamente larga. Analizar en varios pasos
Veamos primero este paso, ApkUtils.findZipSections. Esta función analiza principalmente el archivo APK, obtiene información simple sobre el formato ZIP y devuelve un ZipSections. /p>
ZipSections Contiene información sobre el formato del archivo ZIP, como información del directorio central, información final del directorio central, etc. La comparación con el formato del archivo zip es la siguiente:
Después de obtener ZipSections , puede analizar más el paquete ZIP APK y continuar. En el siguiente proceso de firma,
puede ver que primero se verifica una firma V2. ¿Por qué se verifica primero? Al firmar por primera vez, esta rama lógica anormal se tomará directamente. Al firmar repetidamente, se puede obtener la firma V2 anterior. Se sospecha que el propósito de obtener la firma V2 aquí es excluir la firma V2 y obtener bloques de datos. Además de la firma V2, debido a que la firma en sí no se puede incluir en la firma, el área del directorio central se analizará más adelante para crear un DefaultApkSignerEngine para la firma.
Primero analice el área del directorio central, obtenga el archivo AndroidManifest. obtenga minSdkVersion (afecta el algoritmo de firma) y cree DefaultApkSignerEngine, las firmas V1 V2 están activadas de forma predeterminada.
El trabajo principal de los pasos quinto y sexto es: el preprocesamiento del apk, incluida cierta clasificación de directorios y otras tareas, que deberían ser para un procesamiento más eficiente de las firmas. completado, comienza la firma En el proceso, lo primero que debe hacer es la firma V1 (que existe de forma predeterminada a menos que esté cerrada activamente):
Los pasos 7, 8 y 9 pueden considerarse como la lógica de procesamiento de la firma V1, que se procesa principalmente en V1SchemeSigner, incluida la creación de algunos archivos de firma en la carpeta META-INFO, la actualización del directorio central, la actualización del final del directorio central, etc. El proceso no es complicado y no entraré en detalles El proceso simple es:
Aquí hay una mención especial al problema de las firmas duplicadas: Para un No habrá ningún problema al firmar un APK que ha sido firmado V1 nuevamente. nuevamente, se excluirá el archivo de firma anterior.
Puede ver que los archivos en el directorio, la carpeta META-INF, los archivos que terminan en sf, rsa, etc. no serán procesados por la firma V1, por lo que no hay necesidad de preocuparse por las firmas múltiples aquí. El siguiente paso es procesar la firma V2.
V2SchemeSigner procesa las firmas V2. La lógica es relativamente clara. Realiza directamente un resumen de bloques en el APK firmado por V1 y luego recopila las firmas V2 no cambiará ninguna información después de la firma V1 anterior. Después de la firma, se procesará en la central. Agregue el bloque de firma V2 antes del directorio y actualice la información final del directorio central, porque después de la firma V2, el desplazamiento del directorio central cambiará nuevamente:
El proceso La verificación de firma puede considerarse como el reverso de la firma, excepto que sobrescribe. Es posible que la instalación también deba verificar que la clave pública y la información del certificado sean consistentes; de lo contrario, la instalación de sobrescritura fallará.
La entrada para la verificación de firma se encuentra en la instalación de PackageManagerService. Instale la documentación oficial. Los teléfonos móviles superiores a 7.0 detectarán primero la firma V2. Si la firma V2 no existe, luego verificarán la firma V1. no hay mecanismo de verificación de firma V2. Solo se verificará V1, por lo que si su aplicación es miniSdkVersionlt; 24(N), entonces su método de firma debe contener la firma V1:
El proceso de verificación es el inverso de la firma. Comprender el proceso de firma significa Sin embargo, este artículo no solicita una explicación detallada. Si está interesado, puede analizarlo usted mismo. Solo menciono la instalación de la superposición. Además de verificar la integridad del APK en sí, también. necesita verificar si el certificado es consistente. Solo si el certificado es consistente (la misma firma del almacén de claves), es posible sobrescribirlo. En comparación con una nueva instalación, la instalación superpuesta requiere varias verificaciones más
Aquí solo nos preocupamos por la parte del certificado:
Un breve análisis del principio de firma de Android V1 y V2 p>
Solo como referencia, se aceptan correcciones