Рекомендации по использованию уникальных идентификаторов

В этом документе приведены рекомендации по выбору идентификаторов для приложения в зависимости от сценария использования.

Общие сведения о разрешениях Android можно найти в этой статье. Рекомендации по работе с разрешениями для приложения Android можно найти в этой статье.

Рекомендации по работе с идентификаторами Android

Чтобы защитить конфиденциальность пользователей, используйте наиболее строгий идентификатор, который соответствует вашему сценарию использования приложения. В частности, следуйте приведенным ниже рекомендациям.

  1. По возможности используйте сбрасываемые идентификаторы. В большинстве случаев в приложении можно использовать другие идентификаторы, а не несбрасываемые идентификаторы оборудования.
  2. Не используйте аппаратные идентификаторы. В большинстве случаев вы можете не использовать аппаратные идентификаторы, такие как IMEI, не ограничивая при этом необходимую функциональность.

    В Android 10 (уровень API 29) добавлены ограничения для несбрасываемых идентификаторов, к которым относятся IMEI и серийный номер. Чтобы получить доступ к этим идентификаторам, ваше приложение должно быть приложением владельца устройства или профиля, иметь специальные разрешения оператора связи или разрешение READ_PRIVILEGED_PHONE_STATE.

  3. Используйте рекламный идентификатор только для создания профилей пользователей или показа рекламы. При использовании рекламного идентификатора всегда учитывайте настройки отслеживания рекламы, выбранные пользователями. Если вам необходимо связать рекламный идентификатор с информацией, позволяющей идентифицировать личность, делайте это только с явного согласия пользователя.

  4. Не связывайте сброшенные рекламные идентификаторы.

  5. Во всех остальных случаях, кроме предотвращения мошенничества с платежами и телефонии, по возможности используйте идентификатор установки Firebase (FID) или GUID, хранящийся в частном порядке. Для большинства функций, не связанных с рекламой, достаточно идентификатора установки Firebase или глобального уникального идентификатора.

  6. Используйте API, которые подходят для вашего сценария использования, чтобы минимизировать риски для конфиденциальности. Используйте DRM API для защиты ценного контента и Play Integrity API для защиты от злоупотреблений. Play Integrity API – это самый простой способ определить, является ли устройство подлинным, не нарушая конфиденциальность.

В остальных разделах этого руководства эти правила подробно рассматриваются в контексте разработки приложений для Android.

Как работать с рекламными идентификаторами

Рекламный идентификатор – это сбрасываемый идентификатор, который подходит для показа рекламы. Однако при использовании этого идентификатора необходимо учитывать следующее:

Всегда учитывайте намерение пользователя сбросить рекламный идентификатор. Не используйте другие идентификаторы или цифровые отпечатки, чтобы связать рекламные идентификаторы, полученные после сброса, без согласия пользователя. В Правилах Google Play в отношении контента говорится следующее:

"…новый рекламный идентификатор, присвоенный после сброса, не должен быть связан с предыдущим идентификатором или его данными без явно выраженного согласия пользователя".

Всегда учитывайте пометку персонализированной рекламы. Рекламные идентификаторы можно настраивать, чтобы ограничить объем отслеживаемых данных. Всегда используйте метод AdvertisingIdClient.Info.isLimitAdTrackingEnabled(), чтобы не нарушать пожелания пользователей. В правилах Google Play в отношении контента говорится следующее:

"…необходимо учитывать настройки пользователя в отношении отказа от рекламы на основе интересов или персонализации рекламы. Если эти функции отключены, то вам запрещается использовать рекламный идентификатор для создания пользовательского профиля в рекламных целях или для показа персонализированной рекламы. Однако разрешается контекстная реклама, ограничение частоты показов, отслеживание конверсий, сообщения о нарушениях, а также обнаружение угроз безопасности и случаев мошенничества.

Ознакомьтесь с правилами конфиденциальности и безопасности, которые относятся к использованию рекламных идентификаторов в SDK. Например, если вы передаете true в метод enableAdvertisingIdCollection() из Google Аналитики SDK, ознакомьтесь со всеми действующими правилами Analytics SDK и соблюдайте их.

Также помните, что согласно правилам Google Play в отношении контента рекламный идентификатор "нельзя связывать с информацией, позволяющей идентифицировать личность, или постоянными идентификаторами устройства, такими как SSAID, MAC-адрес или IMEI-код".

Предположим, что вы хотите собрать информацию для заполнения таблиц базы данных со следующими столбцами:

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

В этом примере столбец ad_id можно объединить с информацией, позволяющей идентифицировать личность, через столбец account_id в обеих таблицах. Это будет нарушением Правил Google Play в отношении контента для разработчиков, если вы не получили явного разрешения от пользователей.

Учтите, что связь между идентификатором рекламодателя и информацией, позволяющей идентифицировать личность, не всегда очевидна. В таблицах с ключами в виде информации, позволяющей идентифицировать личность, и идентификаторов объявлений могут быть квазиидентификаторы, которые также вызывают проблемы. Например, предположим, что мы изменили TABLE-01 и TABLE-02 следующим образом:

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

В этом случае, если события кликов происходят достаточно редко, все равно можно сопоставить идентификатор рекламодателя из таблицы 1 и информацию, позволяющую идентифицировать личность, из таблицы 2, используя временную метку события и модель устройства.

Хотя гарантировать отсутствие квазиидентификаторов в наборе данных сложно, вы можете предотвратить наиболее очевидные риски объединения, обобщив уникальные данные, где это возможно. В предыдущем примере это означало бы снижение точности временной метки, чтобы для каждой временной метки отображалось несколько устройств одной модели.

Другие решения:

  • Не создавайте таблицы, в которых информация, позволяющая идентифицировать личность, явно связана с рекламными идентификаторами. В первом примере выше это означает, что столбец account_id не нужно включать в таблицу TABLE-01.

  • Разделение и мониторинг списков контроля доступа для пользователей или ролей, у которых есть доступ как к данным, связанным с рекламным идентификатором, так и к информации, позволяющей идентифицировать личность. Тщательно контролируя и проверяя возможность одновременного доступа к обоим источникам (например, путем объединения таблиц), вы снижаете риск связывания рекламного идентификатора с информацией, позволяющей идентифицировать личность. В целом, контроль доступа означает следующее:

    1. Списки управления доступом (ACL) для данных, связанных с идентификатором рекламодателя, и информации, позволяющей идентифицировать личность, должны быть разделены, чтобы минимизировать количество пользователей или ролей, которые есть в обоих списках.
    2. Внедрите ведение журналов доступа и аудит, чтобы выявлять и устранять любые исключения из этого правила.

Дополнительную информацию об ответственном использовании рекламных идентификаторов можно найти в документации по API AdvertisingIdClient.

Как работать с идентификаторами FID и GUID

Самый простой способ идентифицировать экземпляр приложения, запущенный на устройстве, – использовать идентификатор установки Firebase (FID). Это рекомендуемое решение для большинства случаев, не связанных с рекламой. Доступ к нему есть только у того экземпляра приложения, для которого он был создан. Сбросить его относительно просто, поскольку он хранится только до тех пор, пока приложение установлено.

В результате идентификаторы первых сторон обеспечивают лучшую конфиденциальность по сравнению с несбрасываемыми идентификаторами оборудования на уровне устройства. Дополнительную информацию см. в документации по API firebase.installations.

Если использовать FID нецелесообразно, вы можете использовать собственные глобальные уникальные идентификаторы (GUID) для уникальной идентификации экземпляра приложения. Проще всего это сделать, сгенерировав собственный GUID с помощью следующего кода:

Kotlin

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

Java

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

Поскольку идентификатор уникален, его можно использовать для идентификации конкретного экземпляра приложения. Чтобы избежать проблем, связанных со связыванием идентификатора в разных приложениях, храните GUID во внутреннем хранилище, а не во внешнем (общем). Дополнительную информацию можно найти в статье Общие сведения о хранении данных и файлов.

Не работают с MAC-адресами.

MAC-адреса уникальны, не могут быть сброшены пользователем и сохраняются после сброса настроек. Поэтому в целях защиты конфиденциальности пользователей в Android 6 и более поздних версиях доступ к MAC-адресам ограничен системными приложениями. У сторонних приложений нет к ним доступа.

Изменения в доступности MAC-адресов в Android 11

В приложениях, предназначенных для Android 11 и более поздних версий, рандомизация MAC-адресов для сетей Passpoint выполняется для каждого профиля Passpoint. При этом генерируется уникальный MAC-адрес на основе следующих полей:

  • Полное доменное имя (FQDN)
  • Realm
  • Учетные данные, основанные на учетных данных, используемых в профиле Passpoint:
    • Учетные данные пользователя: имя пользователя.
    • Удостоверение сертификата: сертификат и его тип.
    • Учетные данные SIM-карты: тип EAP и IMSI.

Кроме того, приложения без привилегий не могут получить доступ к MAC-адресу устройства. Им видны только сетевые интерфейсы с IP-адресом. Это влияет на методы getifaddrs() и NetworkInterface.getHardwareAddress(), а также на отправку сообщений RTM_GETLINK Netlink.

Ниже перечислены изменения, которые затронут приложения.

  • NetworkInterface.getHardwareAddress() возвращает null для каждого интерфейса.
  • Приложения не могут использовать функцию bind() для сокетов NETLINK_ROUTE.
  • Команда ip не возвращает информацию об интерфейсах.
  • Приложения не могут отправлять сообщения в RTM_GETLINK.

Обратите внимание, что большинству разработчиков следует использовать API более высокого уровня ConnectivityManager, а не API более низкого уровня, такие как NetworkInterface, getifaddrs() или сокеты Netlink. Например, приложение, которому нужна актуальная информация о текущих маршрутах, может получить ее, отслеживая изменения в сети с помощью ConnectivityManager.registerNetworkCallback() и вызывая связанный с сетью метод LinkProperties.getRoutes().

Характеристики идентификаторов

В ОС Android есть несколько идентификаторов с разными характеристиками. Выбор идентификатора зависит от того, как перечисленные ниже характеристики соотносятся с вашим вариантом использования. Однако эти характеристики также влияют на конфиденциальность, поэтому важно понимать, как они взаимодействуют друг с другом.

Область действия

Область действия идентификатора определяет, какие системы могут получить к нему доступ. Идентификаторы Android обычно делятся на три категории:

  • Одно приложение. Идентификатор является внутренним для приложения и недоступен для других приложений.
  • Группа приложений. Идентификатор доступен заданной группе связанных приложений.
  • Устройство. Идентификатор доступен всем приложениям, установленным на устройстве.

Чем шире область действия идентификатора, тем выше риск того, что он будет использоваться для отслеживания. И наоборот, если идентификатор доступен только одному экземпляру приложения, его нельзя использовать для отслеживания устройства в разных приложениях.

Сбрасываемость и постоянство

Сбрасываемость и постоянство определяют срок действия идентификатора и то, как его можно сбросить. Обычно сброс происходит в самом приложении, через системные настройки, при запуске или установке. Идентификаторы Android могут иметь разный срок действия, но обычно он зависит от того, как сбрасывается идентификатор:

  • Только для сеанса. Новый идентификатор используется при каждом перезапуске приложения.
  • Сброс при установке. Новый идентификатор используется каждый раз, когда пользователь удаляет и заново устанавливает приложение.
  • Сброс настроек. Каждый раз, когда пользователь сбрасывает настройки устройства, создается новый идентификатор.
  • Сохраняется после сброса настроек. Идентификатор не удаляется после сброса настроек.

Сбрасываемость позволяет пользователям создавать новые идентификаторы, не связанные с существующими профилями. Чем дольше и надежнее сохраняется идентификатор (например, если он не удаляется при сбросе настроек), тем выше риск того, что пользователь будет подвергаться долгосрочному отслеживанию. Если идентификатор сбрасывается при переустановке приложения, это снижает его постоянство и позволяет сбросить его, даже если в приложении или системных настройках нет явного элемента управления для этого.

Уникальность

Уникальность определяет вероятность коллизий, то есть существования идентичных идентификаторов в связанной области. На самом высоком уровне глобально уникальный идентификатор никогда не имеет коллизий, даже на других устройствах или в других приложениях. В противном случае уровень уникальности зависит от энтропии идентификатора и источника случайности, используемого для его создания. Например, вероятность коллизии намного выше для случайных идентификаторов, созданных на основе календарной даты установки (например, 2019-03-01), чем для идентификаторов, созданных на основе временной метки Unix (например, 1551414181).

В целом идентификаторы аккаунтов пользователей можно считать уникальными. То есть у каждой комбинации устройства и аккаунта есть уникальный идентификатор. С другой стороны, чем менее уникален идентификатор в популяции, тем выше защита конфиденциальности, поскольку его сложнее использовать для отслеживания отдельного пользователя.

Защита целостности и невозможность отказа

Вы можете использовать идентификатор, который сложно подделать или воспроизвести, чтобы доказать, что связанное устройство или аккаунт обладает определенными свойствами. Например, вы можете доказать, что устройство не является виртуальным устройством, используемым спамером. Идентификаторы, которые сложно подделать, также обеспечивают неотказуемость. Если устройство подписывает сообщение секретным ключом, трудно утверждать, что сообщение было отправлено с чужого устройства. Неотказуемость может быть желательным свойством, например при аутентификации платежа, или нежелательным, например при отправке сообщения, о котором пользователь сожалеет.

Распространенные варианты использования и подходящие идентификаторы

В этом разделе описаны альтернативы использованию аппаратных идентификаторов, таких как IMEI. Использовать идентификаторы оборудования не рекомендуется, поскольку пользователь не может их сбросить и они привязаны к устройству. Во многих случаях достаточно идентификатора на уровне приложения.

Аккаунты

Статус оператора связи

В этом случае приложение взаимодействует с функциями звонков и обмена текстовыми сообщениями на устройстве, используя аккаунт оператора связи.

Рекомендуемые идентификаторы: IMEI, IMSI и Line1.

Почему показана эта рекомендация

Использовать аппаратные идентификаторы можно, если это необходимо для работы функций, связанных с оператором связи. Например, эти идентификаторы можно использовать для переключения между операторами мобильной связи или слотами для SIM-карт, а также для доставки SMS-сообщений по IP (для Line1) – аккаунтов пользователей на основе SIM-карт. Для приложений без привилегий рекомендуется использовать вход в аккаунт, чтобы получать информацию об устройстве пользователя на стороне сервера. Одна из причин заключается в том, что в Android 6.0 (уровень API 23) и более поздних версиях эти идентификаторы можно использовать только через динамическое разрешение. Пользователи могут отключить это разрешение, поэтому ваше приложение должно корректно обрабатывать такие исключения.

Статус мобильной подписки

В этом случае вам нужно связать функции приложения с определенными подписками на мобильные сервисы на устройстве. Например, вам может потребоваться проверить доступ к определенным платным функциям приложения на основе мобильных подписок устройства через SIM-карту.

Рекомендуемый идентификатор: Subscription ID API для идентификации SIM-карт, используемых на устройстве.

Идентификатор подписки – это индекс (начиная с 1), который позволяет уникальным образом идентифицировать установленные на устройстве SIM-карты (в том числе физические и электронные). С помощью этого идентификатора приложение может связывать свои функции с различной информацией о подписке для определенной SIM-карты. Это значение остается неизменным для определенной SIM-карты, если только на устройстве не сброшены настройки. Однако в некоторых случаях у одной SIM-карты может быть разный идентификатор подписки на разных устройствах или у разных SIM-карт может быть один и тот же идентификатор на разных устройствах.

Почему показана эта рекомендация

Некоторые приложения могут использовать для этого ICC ID. Поскольку идентификатор ICC уникален и не может быть сброшен, начиная с Android 10 доступ к нему ограничен приложениями с разрешением READ_PRIVILEGED_PHONE_STATE. Начиная с Android 11, доступ к ICCID через API getIccId() был ограничен ещё сильнее, независимо от целевого уровня API приложения. В затронутых приложениях необходимо перейти на использование идентификатора подписки.

Система единого входа

В этом случае в приложении используется система единого входа, позволяющая пользователям связать существующий аккаунт с вашей организацией.

Рекомендуемый идентификатор: аккаунты, совместимые с Менеджером аккаунтов, например связанные аккаунты Google.

Почему показана эта рекомендация

Связывание аккаунта Google позволяет пользователям связать свой аккаунт Google с вашим приложением, чтобы получить удобный и безопасный доступ к продуктам и сервисам вашей организации. Кроме того, вы можете определить собственные области действия OAuth, чтобы делиться только необходимыми данными. Это повысит доверие пользователей, поскольку они будут точно знать, как используются их данные.

Объявления

Таргетинг

В этом случае приложение создает профиль интересов пользователя, чтобы показывать ему более релевантные объявления.

Рекомендуемый идентификатор. Если ваше приложение использует идентификатор для показа рекламы и загружается или публикуется в Google Play, то в качестве такого идентификатора должен использоваться рекламный идентификатор.

Почему показана эта рекомендация

Это пример использования, связанный с рекламой, для которого может потребоваться идентификатор, доступный в разных приложениях вашей организации. Поэтому рекламный идентификатор – наиболее подходящее решение. Согласно правилам Google Play в отношении контента, для показа рекламы необходимо использовать рекламный идентификатор, поскольку пользователь может его сбросить.

Если вы собираете и используете пользовательские данные в рекламных целях, то независимо от того, передаете ли вы их третьим лицам, вам нужно указать это в разделе безопасности данных на странице Контент приложения в Play Console.

Измерение

В этом случае ваше приложение создает профиль пользователя на основе его действий в приложениях вашей организации на одном устройстве.

Рекомендуемый идентификатор: рекламный идентификатор или API Play Install Referrer.

Почему показана эта рекомендация

Это пример использования, связанный с рекламой, для которого может потребоваться идентификатор, доступный в разных приложениях вашей организации. Поэтому рекламный идентификатор – наиболее подходящее решение. Если вы используете идентификатор для показа рекламы, это должен быть рекламный идентификатор, поскольку пользователь может его сбросить. Подробную информацию можно найти в Правилах Google Play в отношении контента.

Конверсии

В этом случае вы отслеживаете конверсии, чтобы определить, успешна ли ваша маркетинговая стратегия.

Рекомендуемый идентификатор: рекламный идентификатор или API Play Install Referrer.

Почему показана эта рекомендация

Это пример использования, связанный с рекламой, для которого может потребоваться идентификатор, доступный в разных приложениях вашей организации. Поэтому рекламный идентификатор – наиболее подходящее решение. Согласно правилам Google Play в отношении контента, для показа рекламы необходимо использовать рекламный идентификатор, поскольку пользователь может его сбросить.

Ремаркетинг

В этом случае в вашем приложении будет показываться реклама, подобранная с учетом интересов пользователя.

Рекомендуемый идентификатор: рекламный идентификатор.

Почему показана эта рекомендация

Это пример использования, связанный с рекламой, для которого может потребоваться идентификатор, доступный в разных приложениях вашей организации. Поэтому рекламный идентификатор – наиболее подходящее решение. Согласно правилам Google Play в отношении контента для разработчиков, для показа рекламы необходимо использовать рекламный идентификатор, поскольку пользователь может его сбросить.

Аналитика приложений

В этом случае приложение оценивает поведение пользователя, чтобы помочь вам определить следующее:

  • Какие ещё продукты или приложения вашей организации могут подойти пользователю.
  • Как поддерживать интерес пользователей к приложению.
  • Собирать статистику использования и аналитику для пользователей, которые не вошли в аккаунт или используют анонимный режим.

Возможные решения:

  • Идентификатор набора приложений. Позволяет анализировать поведение пользователя в нескольких приложениях, принадлежащих вашей организации, если вы не используете пользовательские данные в рекламных целях. Если вы настраиваете таргетинг на устройства, на которых работают сервисы Google Play, рекомендуем использовать идентификатор набора приложений.
  • Идентификатор Firebase (FID). FID относится к приложению, которое его создает. Это не позволяет использовать идентификатор для отслеживания пользователей в разных приложениях. Его также легко сбросить, поскольку пользователь может очистить данные приложения или переустановить его. Процесс создания FID прост. Ознакомьтесь с руководством по установке Firebase.

Разработка приложений

Отчеты о сбоях

В этом случае приложение собирает данные о том, когда и почему оно дает сбой на устройствах пользователей.

Рекомендуемый идентификатор: FID или идентификатор набора приложений.

Почему показана эта рекомендация

Область действия FID ограничена приложением, в котором он создан. Это не позволяет использовать идентификатор для отслеживания пользователей в разных приложениях. Его также легко сбросить, поскольку пользователь может очистить данные приложения или переустановить его. Процесс создания FID прост. Ознакомьтесь с руководством по установке Firebase. Идентификатор набора приложений позволяет анализировать поведение пользователя в нескольких приложениях, принадлежащих вашей организации, если вы не используете пользовательские данные в рекламных целях.

Отчеты об эффективности

В этом случае приложение собирает показатели эффективности, такие как время загрузки и расход заряда батареи, чтобы помочь улучшить качество приложения.

Рекомендуемый идентификатор: Firebase Performance Monitoring

Почему показана эта рекомендация

Firebase Performance Monitoring позволяет сосредоточиться на наиболее важных показателях и протестировать влияние недавних изменений в приложении.

Тестирование приложений

В этом случае приложение оценивает взаимодействие пользователя с ним для тестирования или отладки.

Рекомендуемый идентификатор: FID или идентификатор набора приложений.

Почему показана эта рекомендация

Область действия FID ограничена приложением, в котором он создан. Это не позволяет использовать идентификатор для отслеживания пользователей в разных приложениях. Его также легко сбросить, поскольку пользователь может очистить данные приложения или переустановить его. Процесс создания FID прост. Ознакомьтесь с руководством по установке Firebase. Идентификатор набора приложений позволяет анализировать поведение пользователя в нескольких приложениях, принадлежащих вашей организации, если вы не используете пользовательские данные в рекламных целях.

Установка на нескольких устройствах

В этом случае вашему приложению необходимо определить правильный экземпляр приложения, если оно установлено на нескольких устройствах для одного и того же пользователя.

Рекомендуемый идентификатор: FID или GUID.

Почему показана эта рекомендация

Идентификатор Firebase предназначен именно для этого. Он действует только в пределах приложения, поэтому его нельзя использовать для отслеживания пользователей в разных приложениях. При переустановке приложения идентификатор сбрасывается. В редких случаях, когда идентификатора FID недостаточно, можно также использовать GUID.

Безопасность

Обнаружение злоупотреблений

В этом случае вы пытаетесь обнаружить несколько поддельных устройств, атакующих ваши серверные службы.

Рекомендуемый идентификатор: токен целостности Google Play Integrity API.

Почему показана эта рекомендация

Чтобы убедиться, что запрос поступает с подлинного устройства Android, а не из эмулятора или другого кода, имитирующего устройство, используйте Google Play Integrity API.

Мошенничество с рекламой

В этом случае Проверка приложений проверяет, являются ли показы и действия пользователей в нем подлинными и поддающимися проверке.

Рекомендуемый идентификатор: рекламный идентификатор.

Почему показана эта рекомендация

Согласно правилам Google Play в отношении контента, в рекламных целях необходимо использовать рекламный идентификатор, поскольку пользователь может его сбросить.

Технологии управления цифровыми правами (DRM)

В этом случае приложение должно защищать интеллектуальную собственность или платный контент от мошеннического доступа.

Рекомендуемый идентификатор. Использование FID или GUID заставляет пользователя переустанавливать приложение, чтобы обойти ограничения на контент. Этого достаточно, чтобы удержать большинство людей от таких действий. Если этого недостаточно, Android предоставляет DRM API, который можно использовать для ограничения доступа к контенту. Он включает идентификатор Widevine для каждого APK.

Пользовательские настройки

В этом случае приложение сохраняет состояние пользователя на устройстве, особенно для пользователей, которые не вошли в систему. Вы можете перенести это состояние в другое приложение, подписанное тем же ключом на том же устройстве.

Рекомендуемый идентификатор: FID или GUID.

Почему показана эта рекомендация

Сохранять информацию при переустановке не рекомендуется, поскольку пользователи могут захотеть сбросить настройки, переустановив приложение.