Assinatura do aplicativo

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:

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.

Processo de verificação de assinatura do APK

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

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.