Assinatura do aplicativo

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:

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.

Processo de verificação de assinatura APK

Figura 1. Processo de verificação de assinatura APK

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.