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 estar assinados serão rejeitados pelo Google Play ou pelo instalador do pacote no dispositivo Android.
No Google Play, a assinatura de aplicativos conecta 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, ao dispositivo Android; e os desenvolvedores podem ser responsabilizados pelo comportamento de seu aplicativo.
No Android, a assinatura do aplicativo é o primeiro passo 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 em diferentes IDs de usuário. A assinatura do aplicativo garante que um aplicativo não possa acessar nenhum outro aplicativo, exceto por meio de um 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 tem a opção de especificar no manifesto que compartilhará um UID com o outro da mesma forma 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 a verificação de CA para certificados de aplicativos.
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 caixas de proteção de aplicativos distintos. Um relacionamento mais próximo com um Application Sandbox compartilhado é permitido por meio do 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 suporta 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 as assinaturas v2+ e, portanto, precisam que os aplicativos contenham 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 Como assinar seu aplicativo .
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 dados não cobertos pelas assinaturas. Isso oferece uma superfície de ataque considerável. Além disso, o verificador de 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 do APK v2 e v3 (esquema v2+)
Os dispositivos que executam o Android 7.0 e posterior são compatíveis com o 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 é criptografado e assinado, então o bloco de assinatura APK resultante é inserido no APK. Para obter detalhes sobre como aplicar o esquema v2+ a um aplicativo, consulte APK Signature Scheme v2 .
Durante a validação, o esquema v2+ trata o arquivo APK como um blob e realiza 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, os 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 faz com que o Android 7.0 e 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.
,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 estar assinados serão rejeitados pelo Google Play ou pelo instalador do pacote no dispositivo Android.
No Google Play, a assinatura de aplicativos conecta 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, ao dispositivo Android; e os desenvolvedores podem ser responsabilizados pelo comportamento de seu aplicativo.
No Android, a assinatura do aplicativo é o primeiro passo 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 em diferentes IDs de usuário. A assinatura do aplicativo garante que um aplicativo não possa acessar nenhum outro aplicativo, exceto por meio de um 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 tem a opção de especificar no manifesto que compartilhará um UID com o outro da mesma forma 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 a verificação de CA para certificados de aplicativos.
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 caixas de proteção de aplicativos distintos. Um relacionamento mais próximo com um Application Sandbox compartilhado é permitido por meio do 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 suporta 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 as assinaturas v2+ e, portanto, precisam que os aplicativos contenham 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 Como assinar seu aplicativo .
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 dados não cobertos pelas assinaturas. Isso oferece uma superfície de ataque considerável. Além disso, o verificador de 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 do APK v2 e v3 (esquema v2+)
Os dispositivos que executam o Android 7.0 e posterior são compatíveis com o 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 é criptografado e assinado, então o bloco de assinatura APK resultante é inserido no APK. Para obter detalhes sobre como aplicar o esquema v2+ a um aplicativo, consulte APK Signature Scheme v2 .
Durante a validação, o esquema v2+ trata o arquivo APK como um blob e realiza 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, os 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 faz com que o Android 7.0 e 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.