Assinatura de aplicativos Android: como funciona e por que é importante
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.
- 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:
- 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.
- 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:
- V1 (Assinatura de Jar): Assina arquivos individuais dentro do APK (ZIP). Isso é lento porque o sistema operacional precisa descompactar e verificar todos os arquivos. Também é vulnerável a certas manipulações de ZIP.
- V2 (esquema de assinatura APK): Signs the entire binary block of the APK. It doesn't require unzipping to verify, making it incredibly fast. Foi introduzido no Android 7.0 (Nougat).
- V3 (rotação de chave): Estende a V2 adicionando uma "linhagem" de chaves. Permite que o desenvolvedor prove que uma nova chave é a sucessora autorizada de uma chave anterior. Introduzido no Android 9.0 (Pie).
- V4 (assinatura de streaming): Projetado especificamente para instalações incrementais, permitindo que os aplicativos sejam verificados enquanto ainda estão sendo baixados por USB ou Wi-Fi.
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ê:
- O Nome Comum (CN) do signatário (por exemplo, "Android").
- O Período de Validade do certificado.
- O Impressões digitais SHA-1/SHA-256.
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:
- 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.
- 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.
- 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".
- 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.
- 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:
- Você tem Aplicativo X versão 1.0 instalado na Play Store.
- Você baixa Aplicativo X versão 1.1 de uma fonte que não é do Play.
- O sistema operacional vê o mesmo nome de pacote (com.example.app), mas o APK é assinado com um certificado diferente (a chave de assinatura da fonte secundária, não a do editor original). Ele se recusa a instalar.
Duas maneiras pelas quais isso acontece na prática:
- 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.
- 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:
- O validade é importante: 10.000 dias (aproximadamente 27 anos) é o valor convencional porque o sistema operacional trata as atualizações assinadas com uma chave quase expirada ou expirada como comprometidas. Gere uma chave de longa duração uma vez e proteja-a.
- Depois de publicado, você não poderá trocar de chave facilmente. O esquema de assinatura v3 adiciona a chave rotação como um recurso explícito: um certificado antigo “abençoa” um novo por meio de uma prova armazenada, permitindo que o sistema operacional aceite atualizações da nova chave, preservando a continuidade da identidade. Sem a v3, perder a chave original significa deixar todas as instalações existentes sem atualizações.
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 agoraArmadilhas comuns de assinatura
- 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.
- 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.
- 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.