Assinatura de aplicativos Android: como funciona e por que é importante

A brass key on a smartphone showing a verified checkmark, illustrating Android app signing

Cada vez que você instala um aplicativo em seu telefone Android, uma verificação de segurança silenciosa, mas crítica, ocorre em segundo plano. Seu telefone verifica o assinatura digital do pacote APK. Esse handshake criptográfico é o que evita que hackers mal-intencionados “envenenem” seus aplicativos com malware, ao mesmo tempo que garante que os desenvolvedores possam enviar atualizações sem perder sua identidade.

Se você escreve aplicativos, assinar é algo que você simplesmente precisa acertar; se você apenas gosta de mexer no Android, é uma das partes do sistema mais satisfatórias de entender. De qualquer forma, como funciona a assinatura de aplicativos vale o seu tempo. Abaixo, percorremos a tecnologia, como os esquemas de assinatura evoluíram e como você pode verificar certificados manualmente online.

O que você aprenderá neste artigo
  • Por que todo aplicativo Android deve ser assinado e qual criptografia está envolvida (RSA/EC).
  • A diferença entre os esquemas de assinatura v1 (JAR), v2, v3 e v4 e qual deles seu aplicativo deve usar hoje.
  • Como o Android decide se permite uma atualização com base na continuidade da assinatura.
  • Como a rotação de chaves permite que um desenvolvedor altere sua chave de assinatura sem interromper as instalações existentes.
  • Como verificar você mesmo a assinatura de qualquer APK, na linha de comando ou com nosso verificador baseado em navegador.

O que é assinatura de aplicativo?

Basicamente, a assinatura de aplicativo é um processo em que um desenvolvedor usa um Chave privada para gerar um bloco de assinatura para os arquivos de seu aplicativo. O Chave Pública correspondente é então incorporado ao APK na pasta META-INF. Quando seu telefone tenta instalar o aplicativo, ele usa a chave pública para verificar se a assinatura corresponde ao conteúdo do arquivo.

Isso fornece duas propriedades principais:

  1. Imutabilidade: Se um único byte do código do aplicativo for alterado (por exemplo, por um Trojan), a assinatura não corresponderá mais ao arquivo e o Android se recusará a instalá-lo.
  2. Prova de identidade: Se um aplicativo tentar atualizar um aplicativo existente, suas assinaturas deverão corresponder. É por isso que você não pode instalar um aplicativo adulterado do Facebook em vez do oficial.

Evolução dos esquemas de assinatura

O Google tem atualizado continuamente o mecanismo de assinatura para melhorar a velocidade e a segurança:

Por que os certificados são importantes para sideload

Quando você baixa um APK de uma fonte não oficial, o Hashing de certificado é seu melhor amigo. Uma impressão digital de certificado (como um hash SHA-256) identifica exclusivamente a chave de assinatura do desenvolvedor. Cada aplicativo mantém a mesma chave de assinatura em todas as suas atualizações, para que você possa comparar a impressão digital de um APK com o valor publicado pelo desenvolvedor para confirmar que é genuíno.

Se você suspeitar que um APK é falso, execute-o por meio de nosso Verificador de APK on-line. Nossa ferramenta irá mostrar a você:

Como o Android verifica uma assinatura no momento da instalação

A etapa "verificar o certificado" é tão frequentemente ignorada que vale a pena examinar o que o sistema operacional realmente faz quando você toca em um APK e o Android decide se deseja instalá-lo:

  1. Abra o APK como ZIP e localize o bloco de assinatura. Para assinaturas v2/v3 que é um bloco estruturado imediatamente antes do diretório central; para o esquema legado v1, é o conteúdo de META-INF/*.RSA, *.DSA ou *.EC.
  2. Calcule resumos SHA-256 de todos os outros bytes do APK. O bloco de assinatura é excluído do seu próprio resumo (digest); todo o resto é hash em pedaços definidos.
  3. Verifique o resumo de cada pedaço em relação aos resumos registrados no bloco de assinatura. Se um único byte tiver sido alterado desde que o desenvolvedor assinou o arquivo, os resumos não corresponderão e a instalação será rejeitada com um erro genérico "Aplicativo não instalado".
  4. Verifique se o próprio bloco de assinatura foi produzido com a chave privada do certificado. A chave pública do certificado é utilizada para verificar a assinatura criptográfica do bloco. Uma verificação bem-sucedida significa que quem assinou o arquivo possuía a chave privada emparelhada com este certificado.
  5. Compare a impressão digital do certificado com qualquer instalação existente do mesmo nome de pacote. Se o pacote já estiver instalado e o novo APK for assinado com um certificado diferente, a instalação será rejeitada com o erro INSTALL_FAILED_UPDATE_INCOMPATIBLE. Esta é a principal defesa anti-falsificação de identidade do sistema operacional: um agente mal-intencionado não pode substituir o aplicativo do seu banco por sua própria cópia, a menos que também roube a chave de assinatura do banco.

Nada disso prova que o desenvolvedor é confiável, apenas que o arquivo que você está prestes a instalar é idêntico em bytes ao que ele assinou e que nenhuma outra parte o adulterou. Confiar no desenvolvedor é uma decisão separada, que você toma ao escolher de quais fontes instalar.

O que “incompatibilidade de assinatura” realmente significa

A surpresa mais comum que as pessoas enfrentam ao fazer o sideload é o erro de “incompatibilidade de assinatura” na atualização. Aqui está o que realmente está acontecendo:

Duas maneiras pelas quais isso acontece na prática:

  1. O APK de terceiros é genuinamente de uma editora diferente, por exemplo, uma cópia "modificada" ou "corrigida". Recusar a instalação é o comportamento correto; instalá-lo significaria confiar a um estranho os mesmos dados que o aplicativo do seu banco já tocou.
  2. O APK de terceiros é um reenvio do APK oficial, mas o sistema Play App Signing do Google assina o download de cada usuário com o wrapper chave de upload do usuário. Às vezes, dois dispositivos podem ver dados de assinatura ligeiramente diferentes para a mesma versão conceitual do aplicativo. Nesse caso, a impressão digital do certificado na raiz ainda corresponde; você pode verificar com nosso Verificador de APK.

Se a impressão digital do certificado verdadeiramente for diferente da instalação existente, a única maneira de avançar é desinstalar a cópia atual primeiro (perdendo seus dados) antes de carregar a substituição, nunca para desabilitar a verificação de assinatura.

Gerando sua própria chave de assinatura (para desenvolvedores)

Se você estiver criando aplicativos Android, eventualmente precisará assinar suas próprias compilações. O comando de uma linha padrão usando keytool de um Java SDK é:

keytool -genkeypair -v \
        -keystore my-release.keystore \
        -alias my-app -keyalg RSA -keysize 2048 \
        -validity 10000

Duas coisas para saber:

Para compilações de teste com carregamento lateral, um keystore de depuração não assinado é adequado; para produção, use um keystore de longa validade protegido por senha e armazenado em backup offline.

Verifique a identidade do aplicativo como um profissional

Não confie em nomes de arquivos genéricos. Verifique o coração criptográfico dos seus APKs em segundos.

Verifique os certificados agora

Armadilhas comuns de assinatura

  1. Certificados autoassinados: A maioria dos aplicativos Android são autoassinados. Unlike SSL for websites, there is no central authority for Android app signing. Você deve confiar diretamente no desenvolvedor.
  2. Certificados de depuração: Os aplicativos criados para teste usam uma chave genérica de "depuração". Esses aplicativos nunca devem ser divulgados ao público e são bloqueados por muitos filtros de segurança.
  3. Perda de chave: Se um desenvolvedor perder seu keystore privado, ele poderá nunca atualizar seu aplicativo novamente. Eles teriam que lançar um aplicativo “Novo” com um nome de pacote diferente.

Escolhendo o esquema de assinatura correto para seu SDK de destino

A assinatura de aplicativos sustenta silenciosamente grande parte da segurança do Android. Depois que o relacionamento da chave privada/pública for clicado, você poderá julgar um aplicativo transferido por sideload por seus méritos e confirmar se o que você está instalando não foi alterado desde que o desenvolvedor o assinou. Para obter mais informações sobre os componentes internos do Android, consulte nosso guia para o formato XAPK.

Projetado e documentado por Mst Shaefale Desenvolvedor líder e arquiteto de pacotes Android • Verificado no Android 12–15

Mst Shaefale mantém a fusão XAPK/APKS do lado do cliente, analisador de manifesto binário e ferramentas de assinatura APK v1+v2 em xapktoapk.com. Identificou um comando desatualizado ou uma alteração no sistema operacional? Envie uma nota editorial.