A assinatura de apps permite que os desenvolvedores identifiquem o autor e o atualizem sem criar interfaces e permissões complicadas. Todos os apps executados na plataforma Android precisam ser assinados pelo desenvolvedor. Os apps que tentam ser instalados sem serem assinados são rejeitados pelo Google Play ou pelo instalador de pacotes no dispositivo Android.
No Google Play, a assinatura de apps conecta a confiança que o Google tem no desenvolvedor e a confiança que o desenvolvedor tem no próprio app. Os desenvolvedores sabem que o app é fornecido sem modificações para o dispositivo Android. Além disso, eles podem ser responsabilizados pelo comportamento do app.
No Android, a assinatura de apps é a primeira etapa para colocar um app no sandbox do aplicativo. O certificado do app assinado define qual ID do usuário está associado a qual app. Apps diferentes são executados com IDs de usuário distintos. A assinatura de apps garante que um app não acessa nenhum outro app, exceto por um IPC bem definido.
Quando um app (arquivo APK) é instalado em um dispositivo Android, o Gerenciador de pacotes verifica se o APK foi assinado corretamente com o certificado incluído nele. 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 ele compartilha um UID com os outros APKs assinados da mesma forma.
Os apps podem ser assinados por terceiros (OEM, operador, mercado alternativo) ou autoassinados. O Android oferece assinatura de código usando certificados autoassinados que os desenvolvedores podem gerar sem assistência ou permissão externa. Os apps não precisam ser assinados por uma autoridade central. Atualmente, o Android não realiza a verificação de AC para certificados de apps.
Os apps também podem declarar permissões de segurança no nível de proteção de assinatura, restringindo o acesso apenas a apps assinados com a mesma chave, mantendo UIDs e sandboxes de aplicativos distintos. Uma relação mais próxima com um sandbox de aplicativos compartilhado é permitida usando o recurso UID compartilhado, em que dois ou mais apps assinados com a mesma chave de desenvolvedor podem declarar um UID compartilhado no manifesto.
Esquemas de assinatura de APK
O Android oferece suporte a três esquemas de assinatura de apps:
- Esquema v1: baseado na assinatura JAR
- Esquema v2: Esquema de assinatura de APK v2, introduzido no Android 7.0.
- Esquema v3: Esquema de assinatura de APK v3, introduzido no Android 9.
Para ter a máxima compatibilidade, assine apps com todos os esquemas, primeiro com a v1, depois com a v2 e, por fim, com a v3. O Android 7.0 e versões mais recentes, além de dispositivos mais recentes, instalam apps assinados com esquemas v2+ mais rapidamente do que aqueles assinados apenas com o esquema v1. Plataformas mais antigas do Android ignoram assinaturas v2+ e, portanto, precisam que os apps tenham assinaturas v1.
Assinatura de arquivos JAR (esquema v1)
A assinatura de APKs faz parte do Android desde o início. Ele é baseado em JAR assinado. Para saber mais sobre o uso desse esquema, consulte a documentação do Android Studio sobre como assinar seu 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 de APK precisa descompactar todas as entradas compactadas, consumindo mais tempo e memória. Para resolver esses problemas, o Android 7.0 introduziu o Esquema de assinatura de APK v2.
Esquema de assinatura de APK v2 e v3 (esquema v2+)
Os dispositivos com o Android 7.0 e versões mais recentes oferecem suporte ao esquema de assinatura do APK v2 (esquema v2) e versões mais recentes. O esquema v2 foi atualizado para v3 no Android 9 para incluir mais informações no bloco de assinatura, mas funciona da mesma forma. O conteúdo do APK é hash e assinado, e o bloco de assinatura do APK resultante é inserido no APK. Para saber mais sobre como aplicar o esquema v2+ a um app, 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. Esse tipo de verificação de APK é substancialmente mais rápido e permite a detecção de mais classes de modificações não autorizadas.
O novo formato é compatível com versões anteriores. Assim, os APKs assinados com o novo formato 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 com a v1.
O hash do arquivo inteiro do APK é verificado em relação à assinatura v2+ armazenada no bloco de assinatura do APK. O hash abrange tudo, exceto o bloco de assinatura do APK, que contém a assinatura v2+. Qualquer modificação no APK fora do bloco de assinatura invalida a assinatura v2+ do APK. Os APKs com assinatura v2+ removida também são rejeitados, porque a assinatura v1 especifica que o APK foi assinado com a v2, o que faz com que o Android 7.0 e versões mais recentes se recusem a verificar os APKs usando as assinaturas v1.
Para saber mais sobre o processo de verificação de assinatura de APK, consulte a seção Verificação do Esquema de assinatura de APK v2.