唯一 ID 的最佳做法

本文將說明如何根據用途,為應用程式選取適當的 ID。

如需查看有關 Android 權限的一般資訊,請參閱權限總覽一文。如需使用 Android 權限的特定最佳做法,請參閱「應用程式權限最佳做法」。

使用 Android ID 的最佳做法

為了保護使用者的隱私權,請使用符合應用程式用途且最嚴格的 ID。請特別遵循下列最佳做法:

  1. 盡可能選擇可由使用者重設的 ID。即使應用程式使用無法重設的硬體 ID 以外的 ID,也能滿足大多數用途。
  2. 避免使用硬體 ID。在大多數用途中,您可以避免使用硬體 ID (例如國際行動裝置識別碼 (IMEI)),而不會限制必要功能。

    Android 10 (API 級別 29) 針對不可重設的 ID (包括 IMEI 和序號) 增設限制。您的應用程式必須是裝置或設定檔擁有者應用程式、具備特殊電信業者權限,或具備 READ_PRIVILEGED_PHONE_STATE 特權權限,才能存取這些 ID。

  3. 只將廣告 ID 用於使用者個人資料或廣告用途。使用廣告 ID 時,請務必尊重使用者對廣告追蹤的選擇。如需將廣告 ID 連結至個人識別資訊,請務必先取得使用者的明確同意。

  4. 請勿在重設廣告 ID 時進行橋接。

  5. 除了防範付款詐欺和電話通訊外,請盡可能使用 Firebase 安裝 ID (FID) 或私密儲存的 GUID,處理所有其他用途。在絕大多數非廣告用途中,FID 或 GUID 應該就足夠。

  6. 請根據用途使用適當的 API,盡可能降低隱私權風險。使用 DRM API 保護高價值內容,並使用 Play Integrity API 防範濫用行為。Play Integrity API 是判斷裝置是否為正版的最簡單方法,不會產生隱私權風險。

本指南的其餘部分將詳細說明這些規則在開發 Android 應用程式時的應用。

使用廣告 ID

廣告 ID 是可由使用者重設的 ID,適用於廣告用途。不過,使用這個 ID 時,請留意下列幾點:

請務必尊重使用者重設廣告 ID 的意願。 未經使用者同意,請勿使用其他 ID 或指紋連結後續的廣告 ID,規避使用者重設廣告 ID 的行為。《Google Play 開發人員內容政策》規定如下:

「...在未經使用者明確同意下,重設後的新廣告 ID 不得與舊 ID 本身或其衍生資料建立連結。」

請一律遵守相關的個人化廣告標記。廣告 ID 可供設定,使用者可以限制與 ID 相關聯的追蹤量。請一律使用 AdvertisingIdClient.Info.isLimitAdTrackingEnabled() 方法,確保您不會規避使用者的意願。《Google Play 開發人員內容政策》規定如下:

「...您的廣告放送方式必須符合使用者的『停用按照興趣顯示廣告』或『停用廣告個人化』設定。如果使用者啟用上述設定,您就不得使用廣告 ID 建立放送廣告所需的設定檔,或針對使用者放送個人化廣告。允許使用的功能包括內容相關廣告、展示頻率上限、轉換追蹤、報表與安全性,以及詐騙偵測。

請留意您使用的 SDK 是否有任何與廣告 ID 相關的隱私權或安全性政策。 舉例來說,如果您將 true 傳遞至 Google Analytics SDK 的 enableAdvertisingIdCollection() 方法,請務必詳閱並遵守所有適用的 Analytics SDK 政策。

此外,請注意,Google Play 開發人員內容政策規定,廣告 ID「不得與個人識別資訊建立連結,或與任何永久裝置 ID (例如 SSAID、MAC 位址、IMEI 等) 建立關聯」。

舉例來說,假設您要收集資訊,填入包含下列資料欄的資料庫資料表:

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

在這個範例中,ad_id 欄可透過兩個資料表中的 account_id 欄與 PII 彙整,如果您未取得使用者的明確權限,這會違反《Google Play 開發人員內容政策》。

請注意,廣告主 ID 和 PII 之間的連結不一定總是這麼明確。PII 和廣告 ID 鍵控資料表中可能都會出現「準 ID」,這也會造成問題。舉例來說,假設我們將 TABLE-01 和 TABLE-02 變更如下:

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

在這種情況下,如果點擊事件夠罕見,仍有可能使用事件的時間戳記和裝置型號,將廣告主 ID TABLE-01 與 TABLE-02 中的 PII 彙整。

雖然通常很難保證資料集中沒有這類準 ID,但您可以盡可能一般化不重複資料,避免最明顯的彙整風險。在上述範例中,這表示降低時間戳記的準確度,讓每個時間戳記都顯示多個相同型號的裝置。

其他解決方案包括:

  • 不設計明確連結 PII 與廣告 ID 的表格。在上述第一個範例中,這代表不將 account_id 欄納入 TABLE-01。

  • 針對可同時存取廣告 ID 鍵控資料和 PII 的使用者或角色,區隔及監控存取控管清單。 嚴格控管及稽核同時存取這兩個來源的能力 (例如透過資料表之間的彙整),可降低廣告 ID 與 PII 之間關聯的風險。一般來說,控管存取權是指執行下列操作:

    1. 請將廣告主 ID 鍵控資料和 PII 的存取控制清單 (ACL) 分開,盡量減少同時存在於這兩份 ACL 的個人或角色數量。
    2. 導入存取記錄和稽核功能,偵測及管理這項規則的任何例外狀況。

如要進一步瞭解如何以負責任的方式使用廣告 ID,請參閱 AdvertisingIdClient API 參考資料。

使用 FID 和 GUID

如要識別在裝置上執行的應用程式例項,最簡單的方法是使用 Firebase 安裝 ID (FID),這也是大多數非廣告用途的建議解決方案。只有佈建的應用程式執行個體可以存取這個 ID,而且 (相對) 容易重設,因為只有在安裝應用程式時才會保留。

因此,與不可重設、裝置範圍的硬體 ID 相比,FID 可提供更完善的隱私權屬性。詳情請參閱 firebase.installations API 參考資料。

如果 FID 不實用,您也可以使用自訂全域專屬 ID (GUID) 來識別應用程式執行個體。最簡單的方法是使用下列程式碼產生自己的 GUID:

Kotlin

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

Java

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

由於 ID 是全域不重複,因此可用於識別特定應用程式執行個體。為避免跨應用程式連結 ID 相關問題,請將 GUID 儲存在內部儲存空間,而非外部 (共用) 儲存空間。詳情請參閱「資料和檔案儲存空間總覽」頁面。

不使用 MAC 位址

MAC 位址在全球都不會重複,使用者無法重設,且恢復原廠設定後仍會保留。基於上述原因,為保護使用者隱私,在 Android 6 以上版本中,只有系統應用程式可以存取 MAC 位址。第三方應用程式無法存取。

Android 11 的 MAC 位址可用性異動

在指定 Android 11 以上版本的應用程式中,Passpoint 網路的 MAC 隨機化功能會依據 Passpoint 設定檔,根據下列欄位產生不重複的 MAC 位址:

  • 完整網域名稱 (FQDN)
  • 運作範圍
  • 憑證,根據 Passpoint 設定檔中使用的憑證:
    • 使用者憑證:使用者名稱
    • 憑證:憑證和憑證類型
    • SIM 憑證:EAP 類型和 IMSI

此外,非特殊權限應用程式無法存取裝置的 MAC 位址,只能看到具有 IP 位址的網路介面。這會影響 getifaddrs() 和 NetworkInterface.getHardwareAddress() 方法,以及傳送 RTM_GETLINK Netlink 訊息。

以下列出應用程式受這項異動影響的方式:

  • NetworkInterface.getHardwareAddress() 會為每個介面傳回空值。
  • 應用程式無法在 NETLINK_ROUTE 通訊端上使用 bind() 函式。
  • ip 指令不會傳回介面相關資訊。
  • 應用程式無法傳送 RTM_GETLINK 訊息。

請注意,大多數開發人員應使用 ConnectivityManager 的高階 API,而非 NetworkInterface、getifaddrs() 或 Netlink 通訊端等低階 API。舉例來說,如果應用程式需要目前路徑的最新資訊,可以使用 ConnectivityManager.registerNetworkCallback() 監聽網路變更,並呼叫網路相關聯的 LinkProperties.getRoutes(),藉此取得這項資訊。

ID 特徵

Android 作業系統提供多種 ID,各有不同的行為特性。您應根據下列特性與用途的搭配方式,決定要使用的 ID。不過,這些特性也會影響隱私權,因此請務必瞭解這些特性如何相互影響。

範圍

ID 範圍說明哪些系統可以存取 ID。Android 識別碼範圍通常分為三種:

  • 單一應用程式:ID 僅供應用程式內部使用,其他應用程式無法存取。
  • 應用程式群組:預先定義的相關應用程式群組可存取 ID。
  • 裝置:裝置上安裝的所有應用程式都能存取 ID。

授予 ID 的範圍越廣,用於追蹤目的的風險就越大。相反地,如果 ID 只能由單一應用程式執行個體存取,就無法用於追蹤不同應用程式交易中的裝置。

可重設性和永久性

可重設性和持續性會定義 ID 的生命週期,並說明如何重設 ID。常見的重設觸發條件包括:在應用程式內重設、透過系統設定重設、在啟動時重設,以及在安裝時重設。Android 識別碼的生命週期可能不盡相同,但通常與 ID 的重設方式有關:

  • 僅限工作階段:每次使用者重新啟動應用程式時,都會使用新的 ID。
  • 安裝重設:每次使用者解除安裝並重新安裝應用程式時,都會使用新的 ID。
  • 恢復原廠設定:每次使用者將裝置恢復原廠設定時,系統都會使用新的 ID。
  • FDR-persistent:恢復原廠設定後,ID 仍會保留。

使用者可以重設 ID,建立與現有設定檔資訊不相關的新 ID。如果 ID 存在時間越長、越可靠 (例如在恢復原廠設定後仍存在),使用者就越有可能受到長期追蹤。如果重新安裝應用程式時重設 ID,就能降低 ID 的持久性,並提供重設 ID 的方法,即使使用者未明確從應用程式或系統設定中重設 ID,也能重設。

唯一性

不重複性會決定發生衝突的可能性,也就是相關範圍內是否存在相同的 ID。在最高層級,全域專屬 ID 絕不會發生衝突,即使在其他裝置或應用程式上也是如此。否則,不重複程度取決於 ID 的熵,以及用來建立 ID 的隨機性來源。舉例來說,如果隨機 ID 是以安裝日期 (例如 2019-03-01) 做為種子,則發生衝突的機率會遠高於以安裝時的 Unix 時間戳記 (例如 1551414181) 做為種子的 ID。

一般來說,使用者帳戶 ID 可視為不重複。也就是說,每個裝置/帳戶組合都有專屬 ID。另一方面,如果識別碼在母體中的獨特性越低,隱私保護程度就越高,因為這類識別碼較不適合用來追蹤個別使用者。

完整性防護和不可否認性

您可以使用難以偽造或重播的 ID,證明相關聯的裝置或帳戶具有特定屬性。舉例來說,您可以證明裝置不是垃圾訊息散布者使用的虛擬裝置。難以偽造的 ID 也提供不可否認性。如果裝置使用私密金鑰簽署訊息,就很難聲稱訊息是由其他人的裝置傳送。使用者可能需要不可否認性 (例如驗證付款時),也可能不需要 (例如傳送後悔的訊息時)。

常見用途和適用的 ID

本節提供使用硬體 ID (例如 IMEI) 的替代方案。不建議使用硬體 ID,因為使用者無法重設,且 ID 範圍限於裝置。在許多情況下,應用程式範圍 ID 就足夠。

帳戶

貨運公司狀態

在這種情況下,應用程式會使用電信業者帳戶與裝置的電話和簡訊功能互動。

建議使用的 ID:IMEI、IMSI 和 Line1

為何推薦這項商品?

如果電信業者相關功能需要使用硬體 ID,則可使用。舉例來說,您可以使用這些 ID 切換行動電信業者或 SIM 卡插槽,或透過 IP (Line1) 傳送簡訊 - SIM 卡型使用者帳戶。不過,對於非特殊權限應用程式,建議您使用帳戶登入,在伺服器端擷取使用者裝置資訊。其中一個原因是,在 Android 6.0 (API 級別 23) 以上版本中,這些 ID 只能透過執行階段權限使用。使用者可能會關閉這項權限,因此應用程式應妥善處理這些例外狀況。

行動裝置訂閱狀態

在這種情況下,您需要將應用程式功能與裝置上的特定行動服務訂閱項目建立關聯。舉例來說,您可能需要根據裝置透過 SIM 卡訂閱的行動方案,驗證特定付費應用程式功能的存取權。

建議使用的 ID: Subscription ID API,用於識別裝置上使用的 SIM 卡。

訂閱 ID 提供索引值 (從 1 開始),用於唯一識別裝置上使用的已安裝 SIM 卡 (包括實體和電子 SIM 卡)。透過這個 ID,應用程式可以將其功能與特定 SIM 卡的各種訂閱資訊建立關聯。除非裝置恢復原廠設定,否則這個值會保持穩定。不過,在某些情況下,同一張 SIM 卡在不同裝置上可能有不同的訂閱 ID,或不同 SIM 卡在不同裝置上具有相同的 ID。

為何推薦這項商品?

部分應用程式目前可能會使用 ICC ID 達到此目的。由於 ICC ID 是全域專屬且不可重設,因此自 Android 10 起,只有具備 READ_PRIVILEGED_PHONE_STATE 權限的應用程式才能存取。自 Android 11 起,Android 進一步限制透過 getIccId() API 存取 ICCID,無論應用程式的目標 API 級別為何。受影響的應用程式應改用訂閱 ID。

單一登入

在這種情況下,應用程式會提供單一登入體驗,讓使用者將現有帳戶與貴機構建立關聯。

建議使用的 ID:與帳戶管理工具相容的帳戶,例如 Google 帳戶連結

為何推薦這項商品?

使用者可透過 Google 帳戶連結功能,將現有的 Google 帳戶與您的應用程式建立關聯,更安全、順暢地存取貴機構的產品和服務。此外,您也可以定義自訂 OAuth 範圍,只分享必要資料,並明確定義資料的使用方式,提高使用者信任度。

廣告

指定目標

在這種情況下,應用程式會建立使用者興趣設定檔,向他們顯示更相關的廣告。

建議使用的 ID:如果應用程式使用廣告 ID,並上傳或發布至 Google Play,則該 ID 必須是廣告 ID。

為何推薦這項商品?

這是與廣告相關的用途,可能需要貴機構不同應用程式通用的 ID,因此使用廣告 ID 是最合適的解決方案。根據 Google Play 開發人員內容政策,廣告用途必須使用廣告 ID,因為使用者可以重設廣告 ID。

無論您是否在應用程式中分享使用者資料,只要您收集並用於廣告目的,就必須在 Play 管理中心的「應用程式內容」頁面,於「資料安全性」部分聲明廣告目的。

評估

在這種情況下,應用程式會根據使用者在同一裝置上貴機構應用程式中的行為,建立使用者個人資料。

建議使用的 ID:廣告 ID 或 Play Install Referrer API

為何推薦這項商品?

這是與廣告相關的用途,可能需要貴機構不同應用程式通用的 ID,因此使用廣告 ID 是最合適的解決方案。如果您將 ID 用於廣告用途,該 ID 必須是廣告 ID,因為使用者可以重設。詳情請參閱《Google Play 開發人員內容政策》。

轉換

在本例中,您要追蹤轉換,判斷行銷策略是否成功。

建議使用的 ID:廣告 ID 或 Play Install Referrer API

為何推薦這項商品?

這是與廣告相關的用途,可能需要貴機構不同應用程式通用的 ID,因此使用廣告 ID 是最合適的解決方案。根據 Google Play 開發人員內容政策,廣告用途必須使用廣告 ID,因為使用者可以重設該 ID。

再行銷

在這種情況下,應用程式會根據使用者先前的興趣顯示廣告。

建議使用的 ID:廣告 ID

為何推薦這項商品?

這是與廣告相關的用途,可能需要貴機構不同應用程式通用的 ID,因此使用廣告 ID 是最合適的解決方案。根據 Google Play 開發人員內容政策,廣告用途必須使用廣告 ID,因為使用者可以重設廣告 ID。

應用程式數據分析

在這種情況下,應用程式會評估使用者行為,協助您判斷下列事項:

  • 貴機構有哪些其他產品或應用程式可能適合使用者。
  • 如何讓使用者持續使用應用程式。
  • 評估未登入或匿名使用者的使用統計資料和數據分析。

可能的解決方案包括:

  • 應用程式組 ID:只要不將使用者資料用於廣告用途,您就可以透過應用程式組 ID,分析使用者在貴機構擁有的多個應用程式中的行為。如果指定目標是採用 Google Play 服務的裝置,建議使用應用程式組 ID。
  • Firebase ID (FID):FID 的範圍僅限於建立該 ID 的應用程式,因此無法用於跨應用程式追蹤使用者。此外,使用者只要清除應用程式資料或重新安裝應用程式,就能輕鬆重設 FID。建立 FID 的程序很簡單,請參閱 Firebase 安裝指南。

應用程式開發

當機回報

在這種情況下,應用程式會收集資料,瞭解在使用者裝置上當機的時間和原因。

建議使用的 ID:FID 或應用程式組 ID

為何推薦這項商品?

FID 的範圍僅限於建立該 ID 的應用程式,因此無法用於跨應用程式追蹤使用者。使用者可以清除應用程式資料或重新安裝應用程式,因此也能輕鬆重設。建立 FID 的程序很簡單,請參閱 Firebase 安裝指南。只要不將使用者資料用於廣告目的,您就可以透過應用程式組 ID,分析使用者在貴機構擁有的多個應用程式中的行為。

成效報表

在這種情況下,應用程式會收集載入時間和電池用量等成效指標,協助提升應用程式品質。

建議使用的 ID: Firebase Performance Monitoring

為何推薦這項商品?

Firebase Performance Monitoring 可協助您專注於最重要的指標,並測試應用程式近期變更的影響。

應用程式測試

在這種情況下,您的應用程式會評估使用者的應用程式體驗,以便進行測試或偵錯。

建議使用的 ID:FID 或應用程式組 ID

為何推薦這項商品?

FID 的範圍僅限於建立該 ID 的應用程式,因此無法用於跨應用程式追蹤使用者。使用者可以清除應用程式資料或重新安裝應用程式,因此也能輕鬆重設。建立 FID 的程序很簡單,請參閱 Firebase 安裝指南。只要不將使用者資料用於廣告目的,您就可以透過應用程式組 ID,分析使用者在貴機構擁有的多個應用程式中的行為。

跨裝置安裝

在這種情況下,如果同一位使用者在多部裝置上安裝應用程式,應用程式必須識別正確的應用程式執行個體。

建議使用的 ID:FID 或 GUID

為何推薦這項商品?

FID 是專為此目的而設計,其範圍僅限於應用程式,因此無法用於追蹤不同應用程式的使用者,且會在重新安裝應用程式時重設。在極少數情況下,如果 FID 不足,您也可以使用 GUID。

安全性

濫用行為偵測

在本例中,您要偵測多部攻擊後端服務的假裝置。

建議使用的 ID:Google Play Integrity API 完整性權杖

為何推薦這項商品?

如要確認要求來自正版 Android 裝置,而非模擬器或其他假冒裝置的程式碼,請使用 Google Play Integrity API。

廣告詐欺

在這種情況下,應用程式會檢查使用者在應用程式中的曝光和動作是否真實且可驗證。

建議使用的 ID:廣告 ID

為何推薦這項商品?

根據《Google Play 開發人員內容政策》,廣告用途必須使用廣告 ID,因為使用者可以重設廣告 ID。

數位著作權管理 (DRM)

在這種情況下,您的應用程式想要防止詐欺性存取智慧財產或付費內容。

建議使用的 ID:使用 FID 或 GUID 會強制使用者重新安裝應用程式,才能規避內容限制,這對大多數人來說是足夠的負擔。如果這項保護措施不夠,Android 提供了 DRM API,可用於限制內容存取權,包括每個 APK 的 ID (Widevine ID)。

使用者偏好設定

在這種情況下,應用程式會儲存每部裝置的使用者狀態,特別是未登入的使用者。您可能會將這個狀態轉移到同一裝置上使用相同金鑰簽署的其他應用程式。

建議使用的 ID:FID 或 GUID

為何推薦這項商品?

不建議在重新安裝時保留資訊,因為使用者可能想透過重新安裝應用程式來重設偏好設定。