A assinatura de aplicativos permite que os desenvolvedores identifiquem o autor do aplicativo e atualizem seu aplicativo sem criar interfaces e permissões complicadas. Todo aplicativo executado na plataforma Android deve ser assinado pelo desenvolvedor . Os aplicativos que tentarem instalar sem serem assinados serão rejeitados pelo Google Play ou pelo instalador do pacote no dispositivo Android.
No Google Play, a assinatura de aplicativos une a confiança que o Google tem com o desenvolvedor e a confiança que o desenvolvedor tem com seu aplicativo. Os desenvolvedores sabem que seu aplicativo é fornecido sem modificações para o dispositivo Android; e os desenvolvedores podem ser responsabilizados pelo comportamento de seus aplicativos.
No Android, a assinatura de aplicativos é a primeira etapa para colocar um aplicativo em seu Application Sandbox. O certificado de aplicativo assinado define qual ID de usuário está associado a qual aplicativo; diferentes aplicativos são executados sob diferentes IDs de usuário. A assinatura de aplicativos garante que um aplicativo não possa acessar qualquer outro aplicativo, exceto através de IPC bem definido.
Quando um aplicativo (arquivo APK) é instalado em um dispositivo Android, o Gerenciador de Pacotes verifica se o APK foi assinado corretamente com o certificado incluído nesse APK. Se o certificado (ou, mais precisamente, a chave pública no certificado) corresponder à chave usada para assinar qualquer outro APK no dispositivo, o novo APK terá a opção de especificar no manifesto que compartilhará um UID com o outro de forma semelhante. APKs assinados.
Os aplicativos podem ser assinados por terceiros (OEM, operadora, mercado alternativo) ou autoassinados. O Android fornece assinatura de código usando certificados autoassinados que os desenvolvedores podem gerar sem assistência ou permissão externa. Os pedidos não precisam ser assinados por uma autoridade central. Atualmente, o Android não realiza verificação de CA para certificados de aplicativos.
Os aplicativos também são capazes de declarar permissões de segurança no nível de proteção de assinatura, restringindo o acesso apenas a aplicativos assinados com a mesma chave, mantendo UIDs e sandboxes de aplicativos distintos. Um relacionamento mais próximo com um Application Sandbox compartilhado é permitido usando o recurso UID compartilhado , onde dois ou mais aplicativos assinados com a mesma chave de desenvolvedor podem declarar um UID compartilhado em seu manifesto.
Esquemas de assinatura de APK
O Android oferece suporte a três esquemas de assinatura de aplicativos:
- Esquema v1: baseado na assinatura JAR
- Esquema v2: Esquema de assinatura APK v2 , que foi introduzido no Android 7.0.
- Esquema v3: Esquema de assinatura APK v3 , que foi introduzido no Android 9.
Para obter compatibilidade máxima, assine aplicativos com todos os esquemas, primeiro com v1, depois com v2 e depois com v3. Dispositivos Android 7.0+ e mais recentes instalam aplicativos assinados com esquemas v2+ mais rapidamente do que aqueles assinados apenas com esquema v1. As plataformas Android mais antigas ignoram as assinaturas v2+ e, portanto, precisam que os aplicativos contenham assinaturas v1.
Assinatura JAR (esquema v1)
A assinatura do APK faz parte do Android desde o início. É baseado em JAR assinado . Para obter detalhes sobre como usar esse esquema, consulte a documentação do Android Studio em Assinar seu aplicativo .
As assinaturas v1 não protegem algumas partes do APK, como metadados ZIP. O verificador APK precisa processar muitas estruturas de dados não confiáveis (ainda não verificadas) e depois descartar os dados não cobertos pelas assinaturas. Isso oferece uma superfície de ataque considerável. Além disso, o verificador APK deve descompactar todas as entradas compactadas, consumindo mais tempo e memória. Para resolver esses problemas, o Android 7.0 introduziu o APK Signature Scheme v2.
Esquema de assinatura APK v2 e v3 (esquema v2+)
Dispositivos que executam o Android 7.0 e versões posteriores são compatíveis com o esquema de assinatura APK v2 (esquema v2) e versões posteriores. (O esquema v2 foi atualizado para v3 no Android 9 para incluir informações adicionais no bloco de assinatura, mas por outro lado funciona da mesma forma.) O conteúdo do APK é criptografado e assinado e, em seguida, o bloco de assinatura do APK resultante é inserido no APK. Para obter detalhes sobre como aplicar o esquema v2+ a um aplicativo, consulte Esquema de assinatura do APK v2 .
Durante a validação, o esquema v2+ trata o arquivo APK como um blob e executa a verificação de assinatura em todo o arquivo. Qualquer modificação no APK, incluindo modificações nos metadados ZIP, invalida a assinatura do APK. Esta forma de verificação do APK é substancialmente mais rápida e permite a detecção de mais classes de modificações não autorizadas.
O novo formato é compatível com versões anteriores, portanto, APKs assinados com o novo formato de assinatura podem ser instalados em dispositivos Android mais antigos (que simplesmente ignoram os dados extras adicionados ao APK), desde que esses APKs também sejam assinados pela v1.
O hash de arquivo inteiro do APK é verificado em relação à assinatura v2+ armazenada no bloco de assinatura do APK. O hash cobre tudo, exceto o bloco de assinatura do APK, que contém a assinatura v2+. Qualquer modificação no APK fora do bloco de assinatura do APK invalida a assinatura v2+ do APK. APKs com assinatura v2+ removida também são rejeitados, porque sua assinatura v1 especifica que o APK foi assinado v2, o que faz com que o Android 7.0 e versões mais recentes se recusem a verificar APKs usando suas assinaturas v1.
Para obter detalhes sobre o processo de verificação de assinatura do APK, consulte a seção Verificação do Esquema de assinatura do APK v2.