最近工作上需要了解 設(shè)備標(biāo)識符,正好有可以學(xué)習(xí)的資料,就轉(zhuǎn)發(fā)在簡書上和大家分享一下。
轉(zhuǎn)發(fā)自:https://developer.android.google.cn/training/articles/user-data-ids.html
使用 Android 標(biāo)識符的最佳做法
在使用 Android 標(biāo)識符時,請遵循以下最佳做法:
#1:避免使用硬件標(biāo)識符。?在大多數(shù)用例中,您可以避免使用硬件標(biāo)識符,例如 SSAID (Android ID) 和 IMEI,而不會限制所需的功能。
#2:只針對用戶分析或廣告用例使用廣告 ID。?在使用廣告 ID?時,請始終遵循用戶關(guān)于廣告跟蹤的選擇。此外,請確保標(biāo)識符無法關(guān)聯(lián)到個人身份信息 (PII),并避免橋接廣告 ID 重置。
#3:盡一切可能針對防欺詐支付和電話以外的所有其他用例使用實例 ID?或私密存儲的 GUID。?對于絕大多數(shù)非廣告用例,使用實例 ID 或 GUID 應(yīng)該足矣。
#4:使用適合您的用例的 API 以盡量降低隱私權(quán)風(fēng)險。?使用?DRM API?保護(hù)重要內(nèi)容,并使用?SafetyNet API?防止濫用行為。SafetyNet API 是能夠確定設(shè)備真?zhèn)味粫兄码[私權(quán)風(fēng)險的最簡單方法。
本指南剩下的部分將以開發(fā) Android 應(yīng)用為背景詳細(xì)介紹這些規(guī)則。
Android 8.0 及更高版本中的標(biāo)識符
MAC 地址具有全局唯一性,無法由用戶重置,在恢復(fù)出廠設(shè)置后也不會變化。因此,一般不建議使用 MAC 地址進(jìn)行任何形式的用戶標(biāo)識。在 Android 6.0(API 級別 23)及更高版本中,本地設(shè)備 MAC 地址(例如 WLAN 和藍(lán)牙)無法通過第三方 API 獲取。WifiInfo.getMacAddress()?方法和?BluetoothAdapter.getDefaultAdapter().getAddress()?方法都會返回?02:00:00:00:00:00。
此外,您還必須擁有下列權(quán)限,才能獲取通過藍(lán)牙和 WLAN 掃描獲得的附近外部設(shè)備的 MAC 地址:
方法/屬性所需權(quán)限
WifiManager.getScanResults()ACCESS_FINE_LOCATION?或?ACCESS_COARSE_LOCATION
BluetoothDevice.ACTION_FOUNDACCESS_FINE_LOCATION?或?ACCESS_COARSE_LOCATION
BluetoothLeScanner.startScan(ScanCallback)ACCESS_FINE_LOCATION?或?ACCESS_COARSE_LOCATION
使用廣告 ID
廣告 ID 是一種可由用戶重置的標(biāo)識符,適用于廣告用例。不過,在使用此 ID 時,請注意以下要點:
始終尊重用戶重置廣告 ID 的意圖。在未經(jīng)用戶同意的情況下,請勿使用其他標(biāo)識符或指紋將后續(xù)廣告 ID 關(guān)聯(lián)起來,對用戶重置進(jìn)行橋接。Google Play 開發(fā)者內(nèi)容政策聲明如下:
“…重置后,在未獲得用戶明確許可的情況下,新的廣告標(biāo)識符不得與先前的廣告標(biāo)識符或由先前的廣告標(biāo)識符所衍生的數(shù)據(jù)相關(guān)聯(lián)?!?/i>
始終尊重關(guān)聯(lián)的個性化廣告標(biāo)記。?廣告 ID 是可配置的,用戶可以限制與 ID 關(guān)聯(lián)的跟蹤數(shù)量。始終使用?AdvertisingIdClient.Info.isLimitAdTrackingEnabled()?方法來確保您沒有忽視用戶的愿望。Google Play 開發(fā)者內(nèi)容政策聲明如下:
“…您還必須遵循用戶的‘選擇停用針對用戶興趣投放廣告’或‘選擇停用廣告?zhèn)€性化功能’設(shè)置。如果用戶已啟用此設(shè)置,您不得出于廣告目的而使用廣告標(biāo)識符創(chuàng)建用戶個人資料,也不得使用廣告標(biāo)識符向用戶投放個性化廣告。允許的活動包括:內(nèi)容相關(guān)廣告定位、頻次上限、轉(zhuǎn)化跟蹤、生成報表以及安全性和欺詐檢測。”
注意與您使用的 SDK 有關(guān)、涉及廣告 ID 用途的任何隱私權(quán)或安全性政策。例如,如果您將?true?傳遞到 Google Analytics(分析)SDK 中的?enableAdvertisingIdCollection()?方法,請務(wù)必查看和遵守所有適用的?Google Analytics(分析)SDK 政策。
此外,還要注意,Google Play 開發(fā)者內(nèi)容政策要求廣告 ID“不得與個人身份信息或任何永久性設(shè)備標(biāo)識符(例如:SSAID、MAC 地址、IMEI 等)相關(guān)聯(lián)?!?/p>
舉例來說,假設(shè)您想要收集信息來填充包含以下列的數(shù)據(jù)庫表:
TABLE-01
timestampad_idaccount_idclickid
TABLE-02
account_idnamedobcountry
在本例中,ad_id?列可通過兩個表中都存在的?account_id?列與 PII 關(guān)聯(lián),如果您未獲得用戶的明確許可,則會違反?Google Play 開發(fā)者內(nèi)容政策。
請記住,廣告主 ID 與 PII 之間的關(guān)聯(lián)并非總是這樣明確。PII 和廣告 ID 鍵控表中可能都存在一些“準(zhǔn)標(biāo)識符”,它們也會引發(fā)問題。例如,假設(shè)我們對 TABLE-01 和 TABLE-02 做如下更改:
TABLE-01
timestampad_idclickiddev_model
TABLE-02
timestampdemoaccount_iddev_modelname
在此情況下,點擊事件足夠罕見的話,仍然可以利用事件的時間戳和設(shè)備型號在廣告主 ID TABLE-01 與 TABLE-02 中包含的 PII 之間建立關(guān)聯(lián)。
盡管通常難以保證數(shù)據(jù)集內(nèi)不存在此類準(zhǔn)標(biāo)識符,但您可以通過盡可能泛化唯一數(shù)據(jù)來預(yù)防最明顯的關(guān)聯(lián)風(fēng)險。在前面的示例中,這意味著需要降低時間戳的準(zhǔn)確性,讓每個時間戳都對應(yīng)多臺同型號的設(shè)備。
其他解決方案包括:
設(shè)計表時不在 PII 與廣告 ID 之間建立明確關(guān)聯(lián)。在上面的第一個示例中,這意味著 TABLE-01 中不能包含?account_id?列。
對于同時擁有廣告 ID 鍵控數(shù)據(jù)和 PII 訪問權(quán)限的用戶或角色,隔離并監(jiān)控其訪問控制列表。通過嚴(yán)格控制和審核同時訪問兩個來源(例如,在兩個表之間建立關(guān)聯(lián))的權(quán)限,您可以降低廣告 ID 與 PII 之間有關(guān)聯(lián)的風(fēng)險。一般來說,控制訪問權(quán)限需要執(zhí)行以下操作:
斷開廣告主 ID 鍵控數(shù)據(jù) ACL 與 PII ACL 之間的關(guān)聯(lián),以盡量減少同時存在于兩個 ACL 中的用戶或角色的數(shù)量。
實現(xiàn)訪問日志記錄和審核,以檢測和管理此規(guī)則的任何例外情況。
如需詳細(xì)了解如何以負(fù)責(zé)任的方式使用廣告 ID,請參閱?AdvertisingIdClient?API 參考。
使用實例 ID 和 GUID
標(biāo)識運(yùn)行在設(shè)備上的應(yīng)用實例最簡單明了的方法就是使用實例 ID,在大多數(shù)非廣告用例中,這是建議的解決方案。只有進(jìn)行了針對性配置的應(yīng)用實例才能訪問該標(biāo)識符,并且標(biāo)識符重置起來(相對)容易,因為它只存在于應(yīng)用的安裝期。
因此,與無法重置的設(shè)備級硬件 ID 相比,實例 ID 具有更好的隱私權(quán)屬性。如需了解詳細(xì)信息,請參閱?FirebaseInstanceId?API 參考。
對于實例 ID 不實用的情況,您還可以使用自定義全局唯一 ID (GUID) 對應(yīng)用實例進(jìn)行唯一標(biāo)識。最簡單的方式是使用以下代碼生成您自己的 GUID。
? ? var uniqueID = UUID.randomUUID().toString()
由于該標(biāo)識符具有全局唯一性,您可以使用它來標(biāo)識特定應(yīng)用實例。為了避免與跨應(yīng)用關(guān)聯(lián)標(biāo)識符有關(guān)的問題,請將 GUID 存儲到內(nèi)部存儲空間,而不是外部(共享)存儲設(shè)備。有關(guān)詳情,請參閱數(shù)據(jù)和文件存儲概覽頁面。
標(biāo)識符特性
Android 操作系統(tǒng)提供了多種具有不同行為特性的 ID。您應(yīng)該使用何種 ID 取決于以下特性適合您用例的程度。然而,這些特性還涉及到隱私權(quán),因此您必須要了解這些特性彼此之間是如何互動的。
作用域
標(biāo)識符作用域說明了哪些系統(tǒng)可以訪問標(biāo)識符。Android 標(biāo)識符的作用域一般分為三種:
單一應(yīng)用 - ID 僅限應(yīng)用內(nèi)部使用,其他應(yīng)用無法訪問。
一組應(yīng)用 - ID 可供一組預(yù)先定義的相關(guān)應(yīng)用訪問。
設(shè)備 - ID 可供安裝在設(shè)備上的所有應(yīng)用訪問。
向標(biāo)識符授予的作用域越大,其作跟蹤用途的風(fēng)險就越大。相反,如果標(biāo)識符只能由單一應(yīng)用實例訪問,就無法用于跨不同應(yīng)用的事務(wù)跟蹤設(shè)備。
重置性與持久性
重置性和持久性定義了標(biāo)識符的生命周期并說明了如何對其進(jìn)行重置。常見的重置觸發(fā)器包括:應(yīng)用內(nèi)重置、通過系統(tǒng)設(shè)置重置、啟動時重置以及安裝時重置。Android 標(biāo)識符具有不同的生命周期,但生命周期通常與 ID 的重置方式有關(guān):
僅限會話期間 - 每次用戶重新啟動應(yīng)用時都使用新的 ID。
安裝重置 - 每次用戶卸載并重新安裝應(yīng)用時都使用新的 ID。
FDR 重置 - 每次用戶恢復(fù)設(shè)備出廠設(shè)置時都使用新的 ID。
FDR 持久性 - ID 在恢復(fù)出廠設(shè)置后保持不變。
重置性讓用戶能夠創(chuàng)建與任何現(xiàn)有個人資料信息無關(guān)的新 ID。標(biāo)識符持久存在得越久、越可靠(例如在恢復(fù)出廠設(shè)置后繼續(xù)存在的標(biāo)識符),用戶被長期跟蹤的風(fēng)險就越高。如果應(yīng)用重新安裝時標(biāo)識符被重置,即使沒有顯式用戶控件可以在應(yīng)用或系統(tǒng)設(shè)置內(nèi)將其重置,這樣做也能縮短其持續(xù)時間并提供一種重置 ID 的手段。
唯一性
唯一性可以確定發(fā)生沖突的可能性,而發(fā)生沖突是指在相關(guān)作用域內(nèi)存在完全相同的標(biāo)識符。在最高級別,全局唯一標(biāo)識符永遠(yuǎn)不會有沖突項,即使在其他設(shè)備/應(yīng)用上也是如此。唯一性級別取決于標(biāo)識符的熵和用來創(chuàng)建標(biāo)識符的隨機(jī)性來源。例如,帶有安裝日期(例如?2019-03-01)的隨機(jī)標(biāo)識符的沖突幾率要比帶有 Unix 安裝時間戳(例如?1551414181)的標(biāo)識符高得多。
一般而言,您可以將用戶帳號標(biāo)識符視為具有唯一性。也就是說,每個設(shè)備/帳號組合都具有一個唯一 ID。另一方面,標(biāo)識符在某一群體內(nèi)的唯一性越低,隱私權(quán)保護(hù)效果就越好,因為它用于跟蹤個別用戶的有效性會降低。
完整性保護(hù)和不可否認(rèn)性
您可以使用難以欺詐或重播的標(biāo)識符證明關(guān)聯(lián)的設(shè)備或帳號具有某些屬性。例如,您可以證明設(shè)備并非被垃圾郵件制作者利用的虛擬設(shè)備。難以欺詐的標(biāo)識符還能提供不可否認(rèn)性。如果設(shè)備用密鑰簽署了一條消息,就難以辯稱這條消息是由他人的設(shè)備發(fā)出的。不可否認(rèn)性可能是用戶需要的(例如,進(jìn)行付款身份驗證),也可能成為令人討厭的屬性(例如,用戶會后悔發(fā)送某條消息)。
常見用例和適用的標(biāo)識符
此部分為使用 IMEI 等硬件 ID 提供了替代方案。我們不建議您使用硬件 ID,因為用戶無法重置它們,并且它們的作用域僅限于相應(yīng)設(shè)備。在許多情況下,作用域僅限于應(yīng)用的標(biāo)識符就足以滿足您的需求。
跟蹤已注銷用戶的偏好設(shè)置
在此情況下,您要在服務(wù)器端保存每個設(shè)備的狀態(tài),而不使用用戶帳號。
使用:實例 ID 或 GUID
為什么這樣建議?
不建議讓信息在重新安裝后依然存在,因為用戶可能想通過重新安裝應(yīng)用重置其偏好設(shè)置。
使用相同的簽名密鑰跟蹤應(yīng)用之間的已注銷用戶偏好設(shè)置
在此情況下,您要在服務(wù)器端保存每個設(shè)備的狀態(tài),并在同一設(shè)備上使用相同的密鑰簽名的不同應(yīng)用之間傳輸此狀態(tài)信息。
使用:SSAID
為什么這樣建議?
在 Android 8.0(API 級別 26)及更高版本中,SSAID 提供了一個在由同一開發(fā)者簽名密鑰簽名的應(yīng)用之間通用的標(biāo)識符。借助它,您可以在這些應(yīng)用之間共享狀態(tài),而無需要求用戶登錄帳號。
跟蹤已注銷用戶的行為
在此情況下,您已經(jīng)根據(jù)用戶在同一設(shè)備上不同應(yīng)用/會話中的行為創(chuàng)建了他們的配置文件。
使用:廣告 ID
為什么這樣建議?
按照?Google Play 開發(fā)者內(nèi)容政策,在廣告用例中使用廣告 ID 是強(qiáng)制性要求,因為用戶可以對其進(jìn)行重置。
生成已注銷/匿名用戶的分析數(shù)據(jù)
在此情況下,您需要衡量已注銷或匿名用戶的使用情況統(tǒng)計信息和分析數(shù)據(jù)。
使用:實例 ID;如果實例 ID 不足以滿足需求,則使用 GUID
為什么這樣建議?
實例 ID 或 GUID 的作用域為創(chuàng)建它的應(yīng)用,這樣可以防止他人利用該標(biāo)識符跟蹤用戶在不同應(yīng)用中的行為。此外,此標(biāo)識符還可以輕松地進(jìn)行重置,因為用戶可以清除應(yīng)用數(shù)據(jù)或重新安裝應(yīng)用。創(chuàng)建實例 ID 和 GUID 的過程簡單明了:
創(chuàng)建實例 ID:參閱?Firebase 云消息傳遞指南。
創(chuàng)建 GUID:在您的應(yīng)用中實現(xiàn)邏輯,如以下代碼段所示:
? ? val uniqueID: String = UUID.randomUUID().toString()
請注意,如果您已告知用戶您要收集的是匿名數(shù)據(jù),則應(yīng)該確保不將標(biāo)識符關(guān)聯(lián)到 PII?或其他可能關(guān)聯(lián)到 PII 的標(biāo)識符。
您還可以使用?Google Analytics for Mobile Apps,它提供了一種按應(yīng)用進(jìn)行分析的解決方案。
跟蹤已注銷用戶的轉(zhuǎn)化
在此情況下,您需要通過跟蹤轉(zhuǎn)化情況來確認(rèn)營銷策略是否成功。
使用:廣告 ID
為什么這樣建議?
這是一種與廣告有關(guān)的用例,需要使用在不同應(yīng)用中均可用的 ID,因此使用廣告 ID 是最合適的解決方案。
處理跨不同設(shè)備的多個安裝
在此情況下,您需要在將應(yīng)用安裝到同一用戶的多個設(shè)備上時識別此應(yīng)用的正確實例。
使用:實例 ID 或 GUID
為什么這樣建議?
實例 ID 明確針對這一用途而設(shè)計;其作用域被限定在應(yīng)用范圍,這樣就無法被用于跟蹤用戶在不同應(yīng)用中的行為,并且在應(yīng)用重新安裝后會重置。如果遇到實例 ID 無法滿足需求的罕見情況,您還可以使用 GUID。
防欺詐:強(qiáng)制執(zhí)行免費內(nèi)容限制并檢測女巫攻擊
在此情況下,您希望限制用戶在設(shè)備上能夠查看的免費內(nèi)容(例如文章)的數(shù)量。
使用:實例 ID 或 GUID。在 Android 8.0(API 級別 26)及更高版本中,您也可以選擇 SSAID,因為其作用域僅限于應(yīng)用簽名密鑰。
為什么這樣建議?
如果使用 GUID 或?qū)嵗?ID,用戶要想規(guī)避內(nèi)容限制就必須重新安裝應(yīng)用,這已足以讓大多數(shù)人打消這樣的念頭。如果這樣的保護(hù)還不夠,還可以利用 Android 提供的?DRM API?限制對內(nèi)容的訪問,包括針對每個 APK 的標(biāo)識符、Widevine ID。
運(yùn)營商功能
在此情況下,您的應(yīng)用要使用運(yùn)營商帳號與設(shè)備的電話和短信功能進(jìn)行交互。
使用:IMEI、IMSI 和 Line1
為什么這樣建議?
如果運(yùn)營商相關(guān)功能要求使用硬件標(biāo)識符,則可以使用硬件標(biāo)識符。例如,您可以使用這些標(biāo)識符切換手機(jī)運(yùn)營商/SIM 卡插槽,或者通過 IP(適用于 Line1)發(fā)送短信(基于 SIM 卡的用戶帳號)。不過,對于非特權(quán)應(yīng)用,我們建議您使用帳號登錄在服務(wù)器端檢索用戶設(shè)備信息。這樣做的其中一個原因是,在 Android 6.0(API 級別 23)及更高版本中,這些標(biāo)識符只能通過運(yùn)行時權(quán)限來使用。用戶可能會關(guān)閉此權(quán)限,因此您的應(yīng)用應(yīng)妥善處理這些異常。
濫用檢測:發(fā)現(xiàn)漫游器和 DDoS 攻擊
在此情況下,您希望發(fā)現(xiàn)多臺正在攻擊后端服務(wù)的虛假設(shè)備。
使用:SafetyNet API
為什么這樣建議?
單獨的標(biāo)識符并不能有效地說明設(shè)備的真?zhèn)?。您可以利?SafetyNet API 的?attest()?方法來驗證發(fā)起請求的設(shè)備的完整性,借此驗證請求來自真實的 Android 設(shè)備(而不是模擬器或仿冒其他設(shè)備的其他代碼)。如需了解詳細(xì)信息,請參閱?SafetyNet API?文檔。
欺詐和濫用檢測:檢測重要被盜憑據(jù)
在此情況下,您希望發(fā)現(xiàn)是否在某一臺設(shè)備上多次使用了重要被盜憑據(jù)(例如,進(jìn)行欺詐性支付)。
使用:本質(zhì)上來看,防欺詐需要專有信號,這些信號可以隨著時間的推移而更改,因此超出了本文檔的討論范圍。不過,請注意,您可以在已啟用 root 權(quán)限的設(shè)備或模擬設(shè)備上輕松地修改硬件標(biāo)識符(例如 IMEI 和 IMSI),因此它們并不是防欺詐的可靠標(biāo)識。