Práticas recomendadas para identificadores exclusivos

Este documento oferece orientações para selecionar identificadores apropriados para seu app com base no caso de uso.

Para ter uma visão geral das permissões do Android, consulte Visão geral das permissões. Para conhecer práticas recomendadas específicas de como trabalhar com permissões do Android, consulte Práticas recomendadas para permissões de apps.

Práticas recomendadas para trabalhar com identificadores do Android

Para proteger a privacidade dos seus usuários, use o identificador mais restritivo que atenda ao caso de uso do seu app. Especificamente, siga estas práticas recomendadas:

  1. Escolha identificadores redefiníveis pelo usuário sempre que possível. Seu app pode realizar a maioria dos casos de uso, mesmo quando usa identificadores diferentes de IDs de hardware não reconfiguráveis.
  2. Evite o uso de identificadores de hardware. Na maioria dos casos de uso, você pode evitar o uso de identificadores de hardware, como a Identidade de Equipamento Móvel Internacional (IMEI), sem limitar a funcionalidade necessária.

    O Android 10 (API de nível 29) adiciona restrições para identificadores não redefiníveis, que incluem IMEI e número de série. Seu app precisa ser um dispositivo ou um app do proprietário do perfil, ter permissões especiais para operadoras ou ter a permissão privilegiada READ_PRIVILEGED_PHONE_STATE para acessar esses identificadores.

  3. Use um código de publicidade apenas se for criar perfis de usuários ou em casos de uso de anúncios. Ao usar um código de publicidade, sempre respeite as escolhas dos usuários em relação ao rastreamento de anúncios. Se você precisar conectar o identificador de publicidade a informações de identificação pessoal, faça isso apenas com o consentimento explícito do usuário.

  4. Não associe redefinições de ID de publicidade.

  5. Use um ID de instalação do Firebase (FID, na sigla em inglês) ou um GUID armazenado de forma privada sempre que possível para todos os outros casos de uso, exceto prevenção de fraude de pagamento e telefonia. Para a grande maioria dos casos de uso que não incluem anúncios, um FID ou GUID deve ser suficiente.

  6. Use APIs adequadas ao seu caso de uso para minimizar riscos relacionados à privacidade. Use a API DRM para proteção de conteúdo de alto valor e as APIs Play Integrity para proteção contra abuso. As APIs Play Integrity são a maneira mais fácil de determinar se um dispositivo é genuíno sem gerar riscos à privacidade.

As demais seções deste guia detalham essas regras no contexto do desenvolvimento de apps para Android.

Trabalhar com códigos de publicidade

O ID de publicidade é um identificador redefinível pelo usuário e é adequado para casos de uso de anúncios. No entanto, você precisa ter em mente alguns pontos ao usar esse ID:

Sempre respeite a intenção do usuário ao redefinir o código de publicidade. Não associe redefinições de usuário usando outro identificador ou impressão digital para vincular códigos de publicidade subsequentes sem o consentimento do usuário. A Política de conteúdo para desenvolvedores do Google Play afirma o seguinte:

"... Se for redefinido, o novo código de publicidade não poderá ser vinculado a um identificador anterior nem a dados derivados desse código sem o consentimento explícito do usuário."

Sempre respeite o sinalizador de anúncios personalizados associado. Códigos de publicidade são configuráveis de forma que os usuários possam limitar a quantidade de rastreamento associada a eles. Sempre use o método AdvertisingIdClient.Info.isLimitAdTrackingEnabled() para garantir que você não esteja frustrando a vontade dos usuários. A Política de conteúdo para desenvolvedores do Google Play afirma o seguinte:

"... É preciso respeitar a configuração "Desativar publicidade com base em interesses" ou "Desativar a Personalização de anúncios" do usuário. Se um usuário tiver ativado essa configuração, o código de publicidade não poderá ser usado na criação de perfis de usuários para fins publicitários ou para segmentação de usuários com publicidade personalizada. As atividades permitidas incluem publicidade contextual, limite de frequência, acompanhamento de conversões, geração de relatórios e detecção de fraudes e segurança."

Esteja ciente de todas as políticas de privacidade ou de segurança associadas a SDKs que você usa e que estejam relacionadas ao uso de códigos de publicidade. Por exemplo, se você transmitir true para o método enableAdvertisingIdCollection() do SDK do Google Analytics, leia e cumpra todas as políticas do SDK do Google Analytics aplicáveis.

Além disso, esteja ciente de que a Política de conteúdo para desenvolvedores do Google Play afirma que o código de publicidade "não pode estar vinculado a informações de identificação pessoal nem associado a qualquer identificador de dispositivo em tempo integral (por exemplo, SSAID, endereço MAC, IMEI etc.)"

Por exemplo, suponha que você queira coletar informações para preencher tabelas de bancos de dados com as seguintes colunas:

TABLE-01
timestamp ad_id account_id clickid
TABLE-02
account_id name dob country

Nesse exemplo, a coluna ad_id poderia ser associada a PII por meio da coluna account_id nas duas tabelas, o que seria uma violação da Política de conteúdo para desenvolvedores do Google Play se você não tivesse permissão explícita dos seus usuários.

Lembre-se de que a relação entre um código de publicidade e PII nem sempre é tão explícita. É possível ter "quase identificadores" que aparecem nas tabelas com chaves de ID de anúncios e PII, o que também causa problemas. Por exemplo, suponha que alteremos TABLE-01 e TABLE-02 da seguinte forma:

TABLE-01
timestamp ad_id clickid dev_model
TABLE-02
timestamp demo account_id dev_model name

Nesse caso, com eventos de cliques suficientemente raros, ainda é possível vincular o código de publicidade de TABLE-01 com as PII contidas em TABLE-02 usando o carimbo de data/hora do evento e o modelo do dispositivo.

Embora geralmente seja difícil garantir que nenhum desses quase identificadores exista em um conjunto de dados, você pode evitar os riscos de associação mais óbvios, generalizando dados exclusivos sempre que possível. No exemplo anterior, isso significaria reduzir a precisão do carimbo de data/hora para que vários dispositivos com o mesmo modelo aparecessem para cada carimbo.

Outras soluções incluem:

  • Não criar tabelas que vinculem explicitamente PII a códigos de publicidade. No primeiro exemplo acima, isso significa não incluir a coluna account_id em TABLE-01.

  • Segregar e monitorar listas de controle de acesso para usuários ou papéis que têm acesso aos dados com chave do ID de publicidade e PII. Ao controlar e auditar rigidamente a capacidade de acessar as duas fontes simultaneamente (por exemplo, realizando uma junção entre tabelas), você reduz o risco de associação entre o ID de publicidade e as PII. De modo geral, controlar o acesso significa fazer o seguinte:

    1. manter listas de controle de acesso (ACLs, na sigla em inglês) para dados com chave de código de publicidade e PII desvinculadas para minimizar o número de indivíduos ou funções em ambas as ACLs;
    2. implementar o registro e a auditoria do acesso para detectar e gerenciar quaisquer exceções a essa regra.

Para ver mais informações sobre como trabalhar de forma responsável com os códigos de publicidade, consulte a referência da API AdvertisingIdClient.

Trabalhar com FIDs e GUIDs

A solução mais simples para identificar uma instância de app em execução em um dispositivo é usar um ID de instalação do Firebase (FID, na sigla em inglês), e essa é a solução recomendada na maioria dos casos de uso que não são anúncios. Somente a instância do app para a qual ele foi provisionado pode acessar esse identificador, e ele é (relativamente) fácil de redefinir, porque ele persiste apenas enquanto o app está instalado.

Como resultado, os FIDs oferecem propriedades de privacidade melhores em comparação com IDs de hardware no escopo do dispositivo não reconfiguráveis. Para mais informações, consulte a referência da API firebase.installations.

Nos casos em que um FID não é prático, você também pode usar IDs globalmente exclusivos (GUIDs, na sigla em inglês) personalizados para identificar exclusivamente uma instância de app. A maneira mais fácil de fazer isso é gerar o próprio GUID usando o código a seguir:

Kotlin

var uniqueID = UUID.randomUUID().toString()

Java

String uniqueID = UUID.randomUUID().toString();

Como esse identificador é globalmente exclusivo, ele pode ser usado para identificar uma instância de app específica. Para evitar preocupações relacionadas à vinculação do identificador entre os apps, salve os GUIDs em um armazenamento interno em vez de externo (compartilhado). Para ver mais informações, consulte a página Visão geral do armazenamento de dados e arquivos.

Não trabalhar com endereços MAC

Os endereços MAC são globalmente exclusivos, não podem ser redefinidos pelo usuário e persistem após uma redefinição para a configuração original. Por esses motivos, para proteger a privacidade do usuário, nas versões 6 e mais recentes do Android, o acesso aos endereços MAC é restrito aos apps do sistema. Apps de terceiros não podem acessá-las.

Mudanças na disponibilidade de endereços MAC no Android 11

Em apps destinados ao Android 11 e versões mais recentes, a ordem aleatória de MAC para redes de Passpoint é feita por perfil de Passpoint, gerando um endereço MAC exclusivo com base nos campos abaixo:

  • Nome de domínio totalmente qualificado (FQDN)
  • Realm
  • Credencial com base na credencial usada no perfil do Passpoint:
    • Credencial do usuário: nome do usuário
    • Credencial do certificado: tipo e certificado
    • Credencial do chip: tipo EAP e IMSI

Além disso, apps não privilegiados não podem acessar o endereço MAC do dispositivo. Apenas as interfaces de rede com um endereço IP ficam visíveis. Isso afeta os métodos getifaddrs() e NetworkInterface.getHardwareAddress(), além do envio de mensagens Netlink RTM_GETLINK.

Veja a seguir uma lista das maneiras que os apps são afetados por essa mudança:

  • NetworkInterface.getHardwareAddress() retorna "null" (nulo) para cada interface.
  • Os apps não podem usar a função bind() em soquetes NETLINK_ROUTE.
  • O comando ip não retorna informações sobre interfaces.
  • Os apps não podem enviar mensagens RTM_GETLINK.

A maioria dos desenvolvedores precisa usar as APIs de nível superior de ConnectivityManager em vez de APIs de nível inferior, como NetworkInterface, getifaddrs() ou soquetes Netlink. Por exemplo, um app que precisa de informações atualizadas sobre as rotas atuais pode conseguir essas informações detectando mudanças de rede usando ConnectivityManager.registerNetworkCallback() e chamando o LinkProperties.getRoutes() associado à rede.

Características do identificador

O SO Android oferece vários códigos com diferentes características de comportamento. O ID a ser usado depende de como as características a seguir funcionam com seu caso de uso. Essas características também trazem implicações de privacidade. Por isso é importante entender como essas características interagem umas com as outras.

Escopo

O escopo do identificador explica quais sistemas podem acessá-lo, e o do Android geralmente é dividido em três tipos:

  • App único: o ID é interno ao app e não pode ser acessado por outros apps.
  • Grupo de apps: o código pode ser acessado por um grupo predefinido de apps relacionados.
  • Dispositivo: o ID pode ser acessado por todos os apps instalados no dispositivo.

Quanto mais amplo for o escopo concedido a um identificador, maior será o risco de ele ser usado para fins de rastreamento. Por outro lado, se um identificador só puder ser acessado por uma única instância de app, ele não poderá ser usado para rastrear um dispositivo em transações entre diferentes apps.

Capacidade de redefinição e persistência

A capacidade de redefinição e a persistência definem a duração da vida útil do identificador e explicam como ele pode ser redefinido. Acionadores de redefinição comuns incluem os seguintes tipos de redefinição: no app, por meio das configurações do sistema, durante a inicialização e durante a instalação. Os identificadores do Android podem ter durações variadas de vida útil, mas elas geralmente são relacionadas ao modo como o ID é redefinido:

  • Somente sessão: um novo ID é usado sempre que o usuário reinicia o app.
  • Redefinição na instalação: um novo ID é usado sempre que o usuário desinstala e reinstala o app.
  • Redefinição para a configuração original: um novo ID é usado sempre que o usuário redefine o dispositivo para configuração original.
  • Persistente à redefinição para a configuração original: o ID persiste após a redefinição para a configuração original.

A capacidade de redefinição dá aos usuários a capacidade de criar um novo ID que não esteja associado a informações de perfis existentes. Quanto mais longa e confiável for a persistência do identificador (por exemplo, um identificador que persiste após redefinições para a configuração original), maior será o risco de o usuário ser submetido a um rastreamento de longo prazo. Se o identificador for redefinido após a reinstalação do app, isso reduzirá a persistência e fornecerá uma forma de redefinir o ID, mesmo que o usuário não controle explicitamente essa redefinição pelo app ou pelas configurações do sistema.

Exclusividade

A exclusividade estabelece a probabilidade de colisões, isto é, a possibilidade de existirem identificadores idênticos no escopo associado. No nível mais alto, um identificador globalmente exclusivo nunca tem uma colisão, mesmo em outros dispositivos ou apps. Caso contrário, o nível de exclusividade dependerá da entropia do identificador e da fonte de aleatoriedade usada para criá-lo. Por exemplo, a chance de uma colisão é muito maior para identificadores aleatórios sugeridos com a data de instalação do calendário (como 2019-03-01) do que para identificadores sugeridos com o carimbo de data/hora Unix da instalação (como 1551414181).

Em geral, identificadores de contas de usuário podem ser considerados exclusivos. Ou seja, cada combinação de dispositivo/conta tem um ID exclusivo. Por outro lado, quanto menos exclusivo for um identificador em uma população, maior será a proteção de privacidade, porque é menos útil para rastrear um usuário individual.

Proteção de integridade e não repudiabilidade

Você pode usar um identificador difícil de falsificar ou repetir para provar que o dispositivo ou a conta associados têm determinadas propriedades. Por exemplo, você pode provar que o dispositivo não é um dispositivo virtual usado por um criador de spams. Identificadores difíceis de falsificar também proporcionam a não repudiabilidade. Se o dispositivo assinar uma mensagem com uma chave secreta, será difícil afirmar que o dispositivo de outra pessoa enviou a mensagem. Não repudiabilidade pode ser algo que um usuário quer, por exemplo, ao autenticar um pagamento, ou uma propriedade indesejável, por exemplo, quando ele envia uma mensagem da qual se arrepende.

Casos de uso comuns e o identificador adequado a usar

Esta seção fornece alternativas para o uso de IDs de hardware, como IMEI. O uso de IDs de hardware não é recomendado, uma vez que o usuário não pode redefini-los, e eles estão no escopo do dispositivo. Em muitos casos, um identificador com escopo no app seria suficiente.

Contas

Status da operadora

Nesse caso, seu app interage com a funcionalidade de smartphone e mensagens de texto do dispositivo usando a conta de uma operadora.

Identificador recomendado para uso:IMEI, IMSI e Line1

Por que essa recomendação?

O uso de identificadores de hardware é aceitável quando ele é necessário para funcionalidades relacionadas à operadora. Por exemplo, você poderia usar esses identificadores para alternar entre operadoras da rede celular ou slots do chip, ou para enviar mensagens SMS do computador (Line1) para contas de usuário baseadas em chip. Para apps sem privilégios, no entanto, recomendamos o uso de login da conta para recuperar informações do dispositivo do usuário no lado do servidor. Um dos motivos para isso é que, no Android 6.0 (API nível 23) e versões mais recentes, esses identificadores só podem ser usados por meio de uma permissão no tempo de execução. Como os usuários podem desativar essa permissão, seu app precisa lidar com essas exceções de forma apropriada.

Status da assinatura para dispositivos móveis

Nesse caso, você precisa associar a funcionalidade do app a determinadas assinaturas de serviços móveis no dispositivo. Por exemplo, pode ser necessário verificar o acesso a determinados recursos premium de apps com base nas assinaturas móveis do dispositivo via chip.

Identificador recomendado para uso:API Subscription ID para identificar chips usados no dispositivo.

O ID da assinatura fornece um valor de índice (a partir de 1) para identificar exclusivamente os chips instalados (incluindo físicos e eletrônicos) usados no dispositivo. Com esse ID, o app pode associar a própria funcionalidade a várias informações de assinatura de um determinado chip. Esse valor é estável para um determinado chip, a menos que o dispositivo seja redefinido para a configuração original. No entanto, pode haver casos em que o mesmo chip tenha um ID de assinatura diferente em dispositivos diferentes, ou em que chips diferentes tenham o mesmo ID em dispositivos diferentes.

Por que essa recomendação?

Alguns apps podem estar usando o ID ICC para essa finalidade. Como o ID do ICC é globalmente exclusivo e não pode ser redefinido, o acesso está restrito a apps com a permissão READ_PRIVILEGED_PHONE_STATE desde o Android 10. No Android 11 e versões mais recentes, o Android restringiu ainda mais o acesso ao ICCID usando a API getIccId(), independente do nível desejado da API do app. Os apps afetados precisam migrar para usar o ID da assinatura.

Logon único

Nesse caso, seu app oferece uma experiência de Logon único, permitindo que os usuários associem uma conta à organização.

Identificador recomendado para usar:contas compatíveis com o gerente de contas, como Vinculação de Contas do Google.

Por que essa recomendação?

Com a vinculação da Conta do Google, os usuários podem associar a Conta do Google de um usuário ao seu app, oferecendo acesso contínuo e mais seguro aos produtos e serviços da sua organização. Além disso, é possível definir escopos OAuth personalizados para compartilhar apenas os dados necessários, aumentando a confiança do usuário ao definir claramente como os dados são usados.

Anúncios

Segmentação

Nesse caso, seu app cria um perfil com os interesses do usuário para mostrar anúncios mais relevantes.

Identificador recomendado para uso:caso seu app use um ID para anúncios e uploads ou publicações no Google Play, ele precisa ser o de publicidade.

Por que essa recomendação?

Esse é um caso de uso relacionado a anúncios, o que pode exigir um ID disponível em diferentes apps da sua organização. Portanto, usar um ID de publicidade é a solução mais adequada. O uso do ID de publicidade é obrigatório para casos de uso de publicidade, de acordo com a Política de conteúdo para desenvolvedores do Google Play, porque o usuário pode redefini-lo.

Mesmo que você compartilhe dados do usuário no seu app, se você os coletar e usar para fins publicitários, vai precisar declarar as finalidades dos anúncios na seção "Segurança dos dados" da página Conteúdo do app no Play Console.

Avaliação

Nesse caso, o app cria um perfil de um usuário com base no comportamento dele nos apps da sua organização no mesmo dispositivo.

Identificador recomendado para uso:ID de publicidade ou APIs de referenciador de instalação do Google Play

Por que essa recomendação?

Esse é um caso de uso relacionado a anúncios, o que pode exigir um ID disponível em diferentes apps da sua organização. Portanto, usar um ID de publicidade é a solução mais adequada. Se você usa um ID para casos de uso de publicidade, ele precisa ser o ID de publicidade, porque o usuário pode redefini-lo. Saiba mais na Política de conteúdo para desenvolvedores do Google Play.

Conversões

Nesse caso, você está rastreando conversões para detectar se sua estratégia de marketing é bem-sucedida.

Identificador recomendado para uso:ID de publicidade ou APIs de referenciador de instalação do Google Play

Por que essa recomendação?

Esse é um caso de uso relacionado a anúncios, o que pode exigir um ID disponível em diferentes apps da sua organização. Portanto, usar um ID de publicidade é a solução mais adequada. O uso do ID de publicidade é obrigatório para casos de uso de publicidade, de acordo com a Política de conteúdo para desenvolvedores do Google Play, porque o usuário pode redefini-lo.

Remarketing

Nesse caso, seu app mostra anúncios com base nos interesses anteriores do usuário.

Identificador recomendado para uso:ID de publicidade

Por que essa recomendação?

Esse é um caso de uso relacionado a anúncios, o que pode exigir um ID disponível em diferentes apps da sua organização. Portanto, usar um ID de publicidade é a solução mais adequada. O uso do ID de publicidade é obrigatório para casos de uso de publicidade, de acordo com a Política de conteúdo para desenvolvedores do Google Play, porque o usuário pode redefini-lo.

Análise de aplicativos

Nesse caso, o app avalia o comportamento de um usuário para ajudar a determinar o seguinte:

  • Quais dos outros produtos ou apps da sua organização podem ser adequados para o usuário.
  • Como manter os usuários interessados em usar seu app
  • Meça as estatísticas de uso e as análises de usuários desconectados ou anônimos.

Possíveis soluções incluem:

  • ID do conjunto de apps:um ID do conjunto de apps permite analisar o comportamento de um usuário em vários apps da sua organização, desde que você não use os dados do usuário para fins de publicidade. Se você estiver segmentando dispositivos com o Google Play Services, recomendamos usar o ID do conjunto de apps.
  • ID do Firebase (FID): um FID tem como escopo o app que o cria, o que impede que o identificador seja usado para rastrear usuários em apps. Ele também é fácil de redefinir, já que o usuário pode limpar os dados do app ou reinstalá-lo. O processo de criação de um FID é simples. Consulte o guia de instalações do Firebase.

Desenvolvimento de apps

Relatórios de erros

Nesse caso, seu app coleta dados sobre quando e por que falha nos dispositivos do usuário.

Identificador recomendado para uso:FID ou ID definido pelo app

Por que essa recomendação?

Um FID tem como escopo o app que o cria, o que impede que o identificador seja usado para rastrear usuários em diferentes apps. Ele também é fácil de redefinir, já que o usuário pode limpar os dados do app ou reinstalá-lo. O processo de criação de um FID é simples. Consulte o Guia de instalações do Firebase. Um ID do conjunto de apps permite analisar o comportamento de um usuário em vários apps da sua organização, desde que você não use dados do usuário para fins de publicidade.

Relatórios de desempenho

Nesse caso, o app coleta métricas de desempenho, como tempos de carregamento e uso da bateria, para melhorar a qualidade dele.

Identificador recomendado para uso: Monitoramento de desempenho do Firebase

Por que essa recomendação?

O Monitoramento de desempenho do Firebase ajuda você a se concentrar nas métricas mais importantes e a testar o impacto de uma mudança recente no seu app.

Testes de apps

Nesse caso, o app avalia a experiência de um usuário para fins de teste ou depuração.

Identificador recomendado para uso:FID ou ID definido pelo app

Por que essa recomendação?

Um FID tem como escopo o app que o cria, o que impede que o identificador seja usado para rastrear usuários em diferentes apps. Ele também é fácil de redefinir, já que o usuário pode limpar os dados do app ou reinstalá-lo. O processo de criação de um FID é simples. Consulte o Guia de instalações do Firebase. Um ID do conjunto de apps permite analisar o comportamento de um usuário em vários apps da sua organização, desde que você não use dados do usuário para fins de publicidade.

Instalação em dispositivos diferentes

Nesse caso, seu app precisa identificar a instância correta quando for instalado em vários dispositivos do mesmo usuário.

Identificador recomendado para uso:FID ou GUID

Por que essa recomendação?

Um FID é criado explicitamente para essa finalidade. O escopo é limitado ao app para que ele não possa ser usado para rastrear usuários em diferentes apps e é redefinido após a reinstalação do app. Nos raros casos em que um FID é suficiente, você também pode usar um GUID.

Segurança

Detecção de abuso

Nesse caso, você está tentando detectar vários dispositivos falsos que estão atacando seus serviços de back-end.

Identificador recomendado para uso:o token de integridade da API Google Play Integrity

Por que essa recomendação?

Para verificar se uma solicitação vem de um dispositivo Android genuíno, em vez de um emulador ou outro dispositivo de falsificação de código, use a API Google Play Integrity.

Fraude de anúncio

Nesse caso, seu app verifica se as impressões e ações de um usuário são genuínas e verificáveis.

Identificador recomendado para uso:ID de publicidade

Por que essa recomendação?

O uso do ID de publicidade é obrigatório para casos de uso de publicidade, de acordo com a Política de conteúdo para desenvolvedores do Google Play, porque o usuário pode redefini-lo.

Gerenciamento de direitos digitais (DRM)

Nesse caso, seu app quer proteger o acesso fraudulento a propriedade intelectual ou conteúdo pago.

Identificador recomendado para uso:o uso de um FID ou GUID força o usuário a reinstalar o app para contornar os limites de conteúdo, o que é um fardo suficiente para impedir a maioria das pessoas. Se essa proteção não for suficiente, o Android fornecerá uma API DRM, que pode ser usada para limitar o acesso ao conteúdo e inclui um identificador por APK, o ID Widevine.

Preferências do usuário

Nesse caso, o app salva o estado do usuário por dispositivo no do app, principalmente para usuários que não estão conectados. É possível transferir esse estado para outro app assinado com a mesma chave no mesmo dispositivo.

Identificador recomendado para uso:FID ou GUID

Por que essa recomendação?

A persistência de informações após reinstalações não é recomendada, porque os usuários podem querer redefinir as preferências reinstalando o app.