A assinatura do aplicativo 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 do aplicativo é a primeira etapa para colocar um aplicativo em seu Application Sandbox. O certificado de aplicativo assinado define qual ID do usuário está associado a qual aplicativo; diferentes aplicativos são executados sob diferentes IDs de usuário. A assinatura do aplicativo garante que um aplicativo não possa acessar nenhum outro aplicativo, exceto por meio 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 executa verificação de CA para certificados de aplicativo.
Os aplicativos também podem 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: APK Signature Scheme v2 , que foi introduzido no Android 7.0.
- esquema v3: APK Signature Scheme v3 , que foi introduzido no Android 9.
Para 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 assinaturas v2+ e, portanto, precisam de aplicativos para conter assinaturas v1.
Assinatura JAR (esquema v1)
A assinatura de 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 Signing your app .
As assinaturas v1 não protegem algumas partes do APK, como metadados ZIP. O verificador de APK precisa processar muitas estruturas de dados não confiáveis (ainda não verificadas) e descartar os dados não cobertos pelas assinaturas. Isso oferece uma superfície de ataque considerável. Além disso, o verificador do 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 de APK v2 e v3 (esquema v2+)
Os dispositivos que executam o Android 7.0 e posterior oferecem suporte ao esquema de assinatura APK v2 (esquema v2) e posterior. (o esquema v2 foi atualizado para v3 no Android 9 para incluir informações adicionais no bloco de assinatura, mas funciona da mesma forma.) O conteúdo do APK é hash e assinado, então o APK Signing Block resultante é inserido no APK. Para obter detalhes sobre como aplicar o esquema v2+ a um aplicativo, consulte Esquema de assinatura de 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 de metadados ZIP, invalida a assinatura do APK. Essa forma de verificação de 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 por v1.
O hash de arquivo inteiro do APK é verificado em relação à assinatura v2+ armazenada no APK Signing Block. O hash cobre tudo, exceto o APK Signing Block, que contém a assinatura v2+. Qualquer modificação no APK fora do APK Signing Block 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 por v2, o que torna o Android 7.0 e mais recente se recusam 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 APK Signature Scheme v2.