Apple提供了各類API,以方便用戶識別各類用途:安全
在iOS的早期,蘋果公司提供了一個uniqueIdentifier財產上UIDevice-親切地稱爲udid (不要與UUID混淆)。雖然這樣的功能在今天看來是不可想象的,但該屬性一直存在到IOS 5,直到它被廢棄並被替換爲identifierForVendor在iOS 6中。服務器
從IOS 6開始,開發人員可使用identifierForVendor財產上UIDevice若要生成在同一供應商建立的應用程序和擴展之間共享的惟一標識符(idfv).網絡
import UIKit let idfv = UIDevice.current.identifierForVendor // BD43813E-CFC5-4EEB-ABE2-94562A6E76CA
根據文獻 identifierForVendor迴歸nil「在從新啓動設備以後,但在用戶解鎖設備以前。」目前還不清楚何時會出現這種狀況,可是若是你的應用程序在後臺作了什麼事情,必定要記住一些事情。app
連同identifierForVendor引進了一種新的行政支助框架,這是蘋果建立的,以幫助區分應用程序功能所需的識別功能與任何服務於廣告的東西。框架
結果advertisingidentifier財產(親切地稱爲idfa(由其同夥)不一樣於identifierForVendor經過爲每一個人返回相同的值。值能夠更改,例如,若是用戶重置廣告標識符或者抹去他們的設備。ide
import AdSupport
let idfa = ASIdentifierManager.shared().advertisingIdentifier
若是廣告跟蹤受到限制,則該屬性將返回一個歸零UUID。學習
idfa.uuidString == "00000000-0000-0000-0000-000000000000" // true if the user has limited ad tracking
奇怪的是,MacOS Mojave引入了一個clearAdvertisingIdentifier()方法,它彷佛會建立一個「公地悲劇」在這種狀況下,一個應用程序可能會破壞其餘人的利益。(從用戶的角度來看,這不是一件壞事!)字體
還有一個奇怪的例子isAdvertisingTrackingEnabled財產。根據文獻:
在執行任何廣告跟蹤以前,請檢查此屬性的值。若是值爲false,則只將廣告標識符用於如下目的:頻率限制、屬性、轉換事件、估計惟一用戶的數量、廣告欺詐檢測和調試。
這種「榮譽制度」方法聽從性使人困惑。這讓你想知道是什麼用法不會屬於這些普遍的津貼範圍以內。
若是你對這件事的警力有任何洞察力,給咱們一條線-咱們想聽更多.ui
identifierForVendor和advertisingIdentifier提供與uniqueIdentifier屬性在IOS 6中替換,只有一個例外:可以在設備重置和應用程序卸載過程當中持久化。編碼
在iOS 11中,蘋果悄悄地推出了DeviceCheck框架,它容許開發人員分配由Apple持久化的兩位信息直到開發人員手動刪除.
任何熟悉DeviceCheck框架的人都應該熟悉與DeviceCheck框架的交互APN在App Store Connect和您的服務器上設置設備以後,客戶端在設備上生成令牌,這些令牌被髮送到服務器以設置或查詢兩位信息:
import DeviceCheck let device = DCDevice.current if device.isSupported { device.generateToken { data, error in if let token = data?.base64EncodedString() { send token to your server } } }
基於設備令牌和客戶端發送的其餘信息,服務器告訴Apple經過發送以下JSON有效負載來設置每一個位值:
{ "device_token": "QTk4QkFDNEItNTBDMy00Qjc5LThBRUEtMDQ5RTQzRjNGQzU0Cg==", "transaction_id": "D98BA630-E225-4A2F-AFEC-BE3A3D591708", "timestamp": 1572531720, "bit0": true, "bit1": false }
爲了在稍後的時間點檢索這兩位,服務器發送一個沒有bit0和bit1字段:
{ "device_token": "QTk4QkFDNEItNTBDMy00Qjc5LThBRUEtMDQ5RTQzRjNGQzU0Cg==", "transaction_id": "D98BA630-E225-4A2F-AFEC-BE3A3D591708", "timestamp": 1572532500 }
若是一切正常,蘋果的服務器將以200狀態代碼和如下JSON有效負載:
{ "bit0" : true "bit1" : false, "last_update_time" : "2019-10" }
據稱,蘋果建立了DeviceCheck框架,以知足優步在限制濫用促銷代碼方面的需求。雖然DeviceCheck支持存儲只兩位信息(例如,足以肯定設備是否曾被用於建立賬戶以及設備是否與欺詐活動相關聯),咱們(誠然是模糊的)擔憂時間戳,即便是截斷,也可能被用來存儲兩位以上的信息。
儘管蘋果提供了這些服務,但廣告商仍在繼續努力規避用戶隱私保護,並利用他們掌握的全部信息,以其餘方式識別用戶。
多年來,蘋果對設備硬件信息的訪問受到限制,已安裝的應用程序, 附近WiFi網絡...他們要求應用程序請求許可才能得到您當前的位置,訪問您的相機和麥克風,瀏覽您的聯繫人,並找到並鏈接到藍牙附件。他們採起了大膽的步驟防止Safari中的用戶跟蹤.
因爲缺少這方面的信息,公司不得不發揮創造力,從現有信息的殘餘物中提煉出獨特的身份。這種由外部因素組合而成的識別過程稱爲指印.
不幸的現實是,咱們能夠經過微不足道的少許信息獲得獨特的識別。例如,一個羣體中的個體最多能夠被四個時間戳座標所挑選出來。(de Montjoye,Hidalgo,Verleysen,&Blondel,2013年)或者僅僅是生日和郵政編碼(Sweeney,2000年).
自2012年以來,每一個WWDC都舉辦了一次關於隱私的會議,但惟一特別提到指紋的是2014年的簡短討論如何避免這樣作。
根據咱們的計算,堅決的一方可使用傳統的、不受限制的API來產生幾十個隨機性:
地區信息(~36位)
地區信息是在蘋果平臺上識別信息的最大來源。你喜歡的語言、區域、日曆、時區的組合,以及你安裝的鍵盤很大程度上說明了你是誰--尤爲是在你沒有那麼傳統的偏好的狀況下。
import Foundation Locale.current.languageCode log2(Double(Locale.isoLanguageCodes.count)) // 9.217 bits Locale.current.regionCode log2(Double(Locale.isoRegionCodes.count)) // 8 bits Locale.current.calendar.identifier // ~2^4 (16) Calendars TimeZone.current.identifier log2(Double(TimeZone.knownTimeZoneIdentifiers.count)) // 8.775 bits UserDefaults.standard.object(forKey: "AppleKeyboards")// ~2^6 (64) iOS keyboards
咱們最近推特關於能夠不受限制地訪問表情符號鍵盤信息的應用程序。從那時起,咱們就被告知蘋果公司正在調查這一問題。
可訪問性(~10位)
可訪問性首選項還提供了大量的信息,每一個單獨的設置都貢獻了一個潛在的比特:
UIAccessibility.isBoldTextEnabled
UIAccessibility.isShakeToUndoEnabled
UIAccessibility.isReduceMotionEnabled
UIAccessibility.isDarkerSystemColorsEnabled
UIAccessibility.isReduceTransparencyEnabled
UIAccessibility.isAssistiveTouchRunning
約25%的用戶利用動態類型經過配置首選字體大小,該選擇還可用於指紋:
let application = UIApplication.shared
application.preferredContentSizeCategory
硬件信息(~5或~6位)
儘管這些年來,操做系統更新中大多數最活躍的比特都被鎖定了,但仍然有足夠多的比特用於識別。
在IOS上,您能夠得到用戶設備的當前模型和存儲量:
import UIKit let device = UIDevice.current device.name // "iPhone 11 Pro" let fileManager = FileManager.default if let path = fileManager.urls(for: .libraryDirectory, in: .systemDomainMask).last?.path, let systemSize = try? fileManager.attributesOfFileSystem(forPath: path)[.systemSize] as? Int { Measurement<UnitInformationStorage>(value: Double(systemSize), unit: .bytes) .converted(to: .gigabytes) // ~256GB }
帶着14個支持的IOS設備,大多數都有3種配置,假設這貢獻了大約32種可能性,或者說是5位。
您能夠在MacOS上更進一步,經過處理器計數和RAM數量來進一步區分硬件:
processInfo.processorCount // 8 Measurement<UnitInformationStorage>(value: Double(processInfo.physicalMemory), unit: .bytes) .converted(to: .gigabytes) // 16GB
很難感受到有多少種不一樣的mac型號在使用?,可是一個合理的估計大概是2。6或27.
蜂窩網絡(~2比特)
知道某人的手機是在威瑞森仍是沃達豐,也能夠被考慮到指紋。您可使用CTTelephonyNetworkInfo類的CoreTelephone框架若要查找具備蜂窩服務的設備的提供程序,請執行如下操做:
import CoreTelephony let networkInfo = CTTelephonyNetworkInfo() let carriers = networkInfo.serviceSubscriberCellularProviders?.values carriers?.map { ($0.mobileNetworkCode, $0.mobileCountryCode) }
每一個國家的供應商數量各不相同,但以美國的4家主要運營商爲指導,咱們能夠說,運營商信息將貢獻約2位(若是您安裝了多個SIM卡,則貢獻更多)。
通訊首選項(2位)
更廣泛的是,即便知道某人是否能夠發送短信或電子郵件,也能夠被考慮到指紋中。能夠在沒有權限的狀況下經過MessageUI框架.
import MessageUI
MFMailComposeViewController.canSendMail()
MFMessageComposeViewController.canSendText()
識別信息的其餘來源
若是數字指紋的使用看起來很奇怪的話,那只是觸及了公司和研究人員如何繞過你的隱私的表面而已。
GeoIP與相關網絡速度
雖然經過傳統的API訪問地理位置須要明確的受權,可是第三方可能可以根據訪問Internet的方式對您所處的世界的位置有一個大體的瞭解。
按源IP地址定位普遍用於區域鎖定和本地化。您還能夠將此信息與平時測量到已知位置的主機,以便更準確地定位位置。(Weinberg,Cho,Christin,Sekar,&Gill,2018):
ping -c 5 99.24.18.13 # San Francisco, USA --- 99.24.18.13 ping statistics --- 5 packets transmitted, 5 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 11.900/12.184/12.895/0.380 ms ping -c 5 203.47.10.37 # Adelaide, Australia --- 203.47.10.37 ping statistics --- 5 packets transmitted, 5 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 202.122/202.433/203.436/0.504 ms
目前還不清楚這是否在IOS中引發關注,但取決於UIDevice電池API是,您可使用它們來識別設備的電池健康。(Olejnik,Acar,Castelluccia,&Diaz,2016年)
var timestampedBatteryLevels: [(Date, Float)] = [] if UIDevice.current.isBatteryMonitoringEnabled { timestampedBatteryLevels.append((Date(), UIDevice.current.batteryLevel)) }
所以,電池級API是在Firefox 55中刪除.若是這看起來很奇怪,那麼考慮一下蘋果公司(Apple)最近發佈了一項iOS的安全更新,由於研究人員證明,陀螺儀校準設置中的微小差別能夠用來惟一地識別設備。(張,貝雷斯福,雪萊,2019年)
另外,若是你想一塊兒進階,不妨添加一下交流羣[1012951431],選擇加入一塊兒交流,一塊兒學習。期待你的加入!(進羣可領取學習禮包)
翻譯地址:https://nshipster.com/device-identifiers/