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

Ao trabalhar com identificadores do Android, siga estas práticas recomendadas:

  1. Evite o uso de identificadores de hardware. Na maioria dos casos de uso, você pode evitar usar identificadores de hardware, como SSAID (Android ID) e 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.

  2. 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. Além disso, certifique-se de que o identificador não possa ser conectado a informações de identificação pessoal (PII, na sigla em inglês) e evite transmitir redefinições de códigos de publicidade.

  3. Use um ID de instância ou um GUID armazenado de forma privada sempre que possível para todos os demais casos de uso, exceto para prevenção de fraude de pagamento e telefonia. Para a grande maioria dos casos de uso que não incluem anúncios, um ID de instância ou GUID deve bastar.

  4. 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 SafetyNet para proteção contra abuso. As APIs SafetyNet são a maneira mais fácil de determinar se um dispositivo é verdadeiro sem incorrer em riscos relacionados à 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 código de publicidade é um identificador que pode ser redefinido pelo usuário e é adequado para casos de uso de anúncios, mas você deve ter em mente alguns pontos ao usá-lo:

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.

  • Como segregar e monitorar as listas de controle de acesso para usuários ou funções que têm acesso a dados com chave de códigos de publicidade e PII. Ao controlar e auditar de forma rigorosa a capacidade de acessar as duas fontes simultaneamente (por exemplo, mesclando as tabelas), você reduz o risco de associação entre o código de publicidade e as PII. De um modo geral, controlar o acesso significa:

    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 IDs de instância e GUIDs

A solução mais simples para identificar a instância de um app executado em um dispositivo é usar um ID de instância. Essa é a solução recomendada na maioria dos casos de uso que não incluem anúncios. Somente a instância do app para que ele foi fornecido pode acessar esse identificador, e é (relativamente) fácil redefini-lo, porque ele persiste apenas enquanto o app está instalado.

Consequentemente, IDs de instância têm propriedades de privacidade melhores em comparação a IDs de hardware com escopo no dispositivo, que não podem ser redefinidos. Para ver mais informações, consulte a referência da API FirebaseInstanceId.

Nos casos em que um ID de instância não é viável, você também pode usar códigos personalizados globalmente exclusivos (GUIDs) para identificar de maneira exclusiva 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, geralmente não é recomendado usar um endereço MAC para nenhuma forma de identificação do usuário. Dispositivos com Android 10 (API de nível 29) e versões mais recentes relatam endereços MAC aleatórios para todos os apps que não são proprietários do dispositivo.

Entre o Android 6.0 (API de nível 23) e o Android 9 (API de nível 28), os endereços MAC de dispositivos locais, como Wi-Fi e Bluetooth, não estão disponíveis por meio de APIs de terceiros. Os métodos WifiInfo.getMacAddress() e BluetoothAdapter.getDefaultAdapter().getAddress() retornam 02:00:00:00:00:00.

Além disso, entre o Android 6.0 e o Android 9, você precisa ter as seguintes permissões para acessar endereços MAC de dispositivos externos próximos disponíveis por meio de buscas de Bluetooth e Wi-Fi:

Método/propriedade Permissões necessárias
WifiManager.getScanResults() ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION
BluetoothDevice.ACTION_FOUND ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION
BluetoothLeScanner.startScan(ScanCallback) ACCESS_FINE_LOCATION ou ACCESS_COARSE_LOCATION

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.

Rastrear as preferências de usuários desconectados

Nesse caso, você está salvando o estado por dispositivo no lado do servidor sem uma conta de usuário.

Use: ID de instância 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.

Rastrear as preferências de usuários desconectados entre apps com a mesma chave de assinatura

Nesse caso, você está salvando o estado por dispositivo no lado do servidor e transferindo-o entre diferentes apps assinados com a mesma chave, no mesmo dispositivo.

Use: SSAID

Por que essa recomendação?

No Android 8.0 (API nível 26) e versões posteriores, o SSAID fornece um identificador comum entre apps assinados pela mesma chave de desenvolvedor. Ele permite que você compartilhe o estado entre esses apps, sem exigir que o usuário faça login em uma conta.

Rastrear o comportamento de usuários desconectados

Nesse caso, você criou um perfil de um usuário com base no comportamento dele em diferentes apps/sessões no mesmo dispositivo.

Use: código de publicidade

Por que essa recomendação?

O uso do código 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.

Gerar análises de usuários desconectados ou anônimos

Nesse caso, você está medindo estatísticas de uso e análises de usuários desconectados ou anônimos.

Use: ID de instância ou um GUID, se um ID de instância não for suficiente

Por que essa recomendação?

O escopo de um ID de instância ou de um GUID é 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 códigos de instâncias e GUIDs é simples.

  • Para criar um ID de instância, consulte o guia do Firebase Cloud Messaging.
  • Para criar um GUID, implemente a lógica no seu app, conforme mostrado no seguinte snippet de código:

    Kotlin

    val uniqueID: String = UUID.randomUUID().toString()
    

    Java

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

Se você informou o usuário que os dados coletados são anônimos, não conecte o identificador a PII ou a outros identificadores que possam estar vinculados a PII.

Você também pode usar o Google Analytics para apps para dispositivos móveis, que oferece uma solução de análise por app.

Rastrear conversões de usuários desconectados

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

Use: código de publicidade

Por que essa recomendação?

Esse é um caso de uso relacionado a anúncios, o que pode exigir um código ID em diferentes apps. Portanto, o uso de um ID de publicidade é a solução mais adequada.

Lidar com várias instalações em diferentes dispositivos

Nesse caso, você precisa identificar a instância correta do app quando ele está instalado em vários dispositivos do mesmo usuário.

Use: ID de instância ou GUID

Por que essa recomendação?

O ID de instância foi criado explicitamente para esse fim. O escopo desse tipo de código é limitado ao app e, por isso, ele não pode ser usado para rastrear usuários em diferentes apps e é redefinido quando o app é reinstalado. Nos raros casos em que um ID de instância é insuficiente, você pode usar um GUID.

Antifraude: como aplicar limites de conteúdo gratuito e detectar ataques Sybil

Nesse caso, você quer limitar a quantidade de conteúdo gratuito, por exemplo, artigos, que o usuário pode ver em um dispositivo.

Use: ID de instância ou GUID. No Android 8.0 (API nível 26) e versões mais recentes, o SSAID também é uma opção, porque tem como escopo a chave de assinatura do app.

Por que essa recomendação?

O uso de um GUID ou ID de instância força o usuário a reinstalar o app para contornar os limites de conteúdo, o que é um empecilho suficiente para 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.

Funcionalidade da operadora

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

Use: 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.

Detecção de abuso: como identificar bots e ataques DDoS

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

Use: a API SafetyNet

Por que essa recomendação?

Um identificador isolado não ajuda a saber se um dispositivo é verdadeiro. Você pode identificar se uma solicitação foi enviada por um dispositivo Android verdadeiro (em vez de um emulador ou outro dispositivo de falsificação de código) usando o método attest() da API SafetyNet para verificar a integridade do dispositivo que fez a solicitação. Para ver informações mais detalhadas, consulte a documentação da API SafetyNet.

Detecção de fraude e abuso: como detectar credenciais roubadas de alto valor

Nesse caso, você está tentando detectar se um único dispositivo está sendo usado várias vezes com credenciais roubadas e de alto valor, por exemplo, para fazer pagamentos fraudulentos.

Use: por natureza, a prevenção contra fraudes exige sinais específicos que podem mudar com o tempo e, portanto, estão fora do escopo deste documento. No entanto, os identificadores de hardware, como IMEI e IMSI, podem ser facilmente modificados em dispositivos com acesso root ou emulados e, portanto, não são indicadores confiáveis de fraude.